常见的几个JVM调优场景

文章目录

    • 调优案例
      • 案例1:应对高并发、短生命周期对象的应用
      • 案例2:防止频繁Full GC导致延迟
      • 案例3:优化服务响应时间,减少停顿时间
      • 案例4:监控和诊断内存泄露
    • 一些参数
      • 堆内存大小
      • 元空间大小
      • 垃圾收集器相关参数
      • 垃圾收集行为控制
      • 内存区域细分(G1收集器特定)
      • GC
      • 栈内存大小
      • 直接内存大小
      • 其他调优选项
      • 监控工具:

基于JDK1.8

调优案例

下面是一些结合实际应用场景的JVM调优参数及其作用的解释:

案例1:应对高并发、短生命周期对象的应用

假设我们正在优化一个高并发且产生大量短生命周期对象的服务,例如Web服务器或高性能计算环境,其中大部分对象在短时间内就会变成无用对象。

  • 参数设置

    -Xms4g -Xmx4g -Xmn2g 
    -XX:SurvivorRatio=8 
    -XX:+UseParallelGC 
    -XX:MaxTenuringThreshold=15
    
  • 参数解析

    • -Xms4g -Xmx4g:设置堆内存大小初始化和最大值均为4GB,保证程序有足够的内存空间,并消除内存自动扩展带来的额外开销。
    • -Xmn2g:设置年轻代大小为2GB,由于大量临时对象主要在年轻代中分配和回收,较大的年轻代可以容纳更多短生命周期的对象,减少年轻代GC频率。
    • -XX:SurvivorRatio=8:设置Eden区与Survivor区的比例为8:1,增加Eden区的空间,有利于容纳更多的新创建对象,减少晋升到老年代的机会。
    • -XX:+UseParallelGC:启用并行垃圾收集器(Parallel GC),利用多核处理器的优势,加快年轻代GC的速度。
    • -XX:MaxTenuringThreshold=15:设置对象在年轻代中经历的GC次数阈值,较高的值意味着对象有更多机会在年轻代内就被回收,降低老年代的压力。

案例2:防止频繁Full GC导致延迟

在一个大型企业级应用中,发现系统频繁触发Full GC,影响了整体响应速度。

  • 参数设置

    -Xms16g -Xmx16g -XX:NewRatio=3 
    -XX:MaxMetaspaceSize=512m 
    -XX:+UseG1GC 
    -XX:InitiatingHeapOccupancyPercent=70
    
  • 参数解析

    • -Xms16g -Xmx16g:确保足够的内存容量,并避免堆大小变化带来的系统抖动。
    • -XX:NewRatio=3:年轻代与老年代的大小比例为1:3,可以根据长期存活对象的比例调整这一参数,减少老年代满载导致的Full GC。
    • -XX:MaxMetaspaceSize=512m:限制元空间大小,防止类元数据过多引起的OOM错误。
    • -XX:+UseG1GC:采用G1垃圾收集器,它能够预测并避免长时间暂停,尤其适用于大型堆且要求低延迟的应用。
    • -XX:InitiatingHeapOccupancyPercent=70:对于G1来说,设置初始标记开始时堆占用率的阈值,当达到这个百分比时触发并发标记周期,通过提前回收避免堆积过多垃圾而引发更耗时的Full GC。

案例3:优化服务响应时间,减少停顿时间

假设我们有一个在线交易系统,对响应时间和稳定性要求极高,希望尽量减少因GC造成的系统暂停时间。

  • 参数设置

    -Xms32g -Xmx32g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 
    -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4 -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=60
    -XX:G1HeapRegionSize=32m -XX:+UnlockExperimentalVMOptions -XX:G1MixedGCLiveThresholdPercent=65
    -XX:+UseStringDeduplication
    
  • 参数解析

    • -Xms32g -Xmx32g:设置堆内存大小,确保有足够的内存满足系统需求,避免内存大小的变化导致额外的性能损失。
    • -XX:+UseG1GC:选择G1垃圾收集器,它具备低延迟的特性,特别适合对响应时间敏感的应用场景。
    • -XX:MaxGCPauseMillis=200:设置G1目标的最大暂停时间,力求减小垃圾回收对应用的影响。
    • -XX:InitiatingHeapOccupancyPercent=45:设置触发并发标记周期的Java堆占用率阈值,早起启动回收可以预防长时间GC。
    • -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4:分别设置并行垃圾回收线程数和并发标记线程数,根据系统CPU核心数适当调整。
    • -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=60:限制年轻代大小范围,使得G1可以灵活调整年轻代大小以适应应用负载。
    • -XX:G1HeapRegionSize=32m:设置G1堆分区大小,依据应用的内存分配特征和机器内存大小合理设置。
    • -XX:+UnlockExperimentalVMOptions -XX:G1MixedGCLiveThresholdPercent=65:解锁实验性VM选项,并设置混合集合的存活对象阈值,调整混合集合的执行时机,降低停顿时间。
    • -XX:+UseStringDeduplication:启用字符串去重功能,减少字符串对象在内存中的重复存储,有效节约内存空间。

案例4:监控和诊断内存泄露

在某大数据处理应用中,发现系统随着时间推移内存占用不断增长,疑似存在内存泄露问题。

  • 参数设置

    -Xmx64g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dumps/java_heapdump.hprof
    -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution
    -XX:+PrintGCCause -XX:+PrintReferenceGC -XX:+PrintAdaptiveSizePolicy
    -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+TraceClassLoading -XX:+TraceClassUnloading
    
  • 参数解析

    • -Xmx64g:设置最大堆内存大小,确保系统有足够的内存运行。
    • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dumps/java_heapdump.hprof:在发生OOM异常时生成堆转储文件,便于后续分析内存泄露。
    • -XX:+UseConcMarkSweepGC:选择CMS垃圾收集器,因为该场景下,稳定性和延迟可能不如防止内存泄露重要。
    • -XX:+PrintGCDetails等GC日志参数:开启详细GC日志,帮助追踪内存分配和回收情况。
    • -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary:解锁诊断VM选项并开启原生内存跟踪,分析非Java堆内存的使用情况。
    • -XX:+TraceClassLoading -XX:+TraceClassUnloading:追踪类加载和卸载,有助于排查是否有类加载泄露的问题。

一些参数

堆内存大小

  • -Xms:设定Java虚拟机初始堆内存大小,默认值由JVM自行决定。

  • -Xmx:设定Java虚拟机最大堆内存大小。

  • -Xmn:设置年轻代(Young Generation)的初始大小和最大大小。这个值通常作为整个堆的一部分来设置。

  • 分配年轻代空间的比例(相对于整个堆):
    -XX:NewRatio=:设置年轻代与老年代(Old Generation)的比例。例如,如果设为3,则年轻代与老年代的大小比例为1:3。

  • Survivor空间的策略:
    -XX:+UseAdaptiveSizePolicy:启用自适应大小策略,JVM会根据应用的行为动态调整年轻代和其他内存区域的大小。

  • 控制晋升至老年代的对象年龄阈值:

    • -XX:MaxTenuringThreshold=<value>:设置对象从年轻代晋升到老年代的最大年龄(即经历多少次Minor GC)。默认值通常是由JVM决定的,也可以手动设置。
  • 并发标记扫描(CMS)或Garbage First(G1)垃圾收集器特有的年轻代相关参数也会有所不同,但上述参数通常是通用的。

举例来说,配置年轻代占总堆大小的1/3且Survivor区与Eden区比为2:8的设置方式可能是:

-Xms1g -Xmx1g -Xmn300m -XX:SurvivorRatio=2
这将启动一个总堆大小为1GB的JVM实例,其中年轻代大小固定为300MB,
Survivor区和Eden区按两个Survivor区各占总年轻代大小的1/10,
Eden区占8/10进行划分。

元空间大小

  • -XX:MetaspaceSize:元空间初始大小,在JDK1.8中替代了PermGen空间,用于存储类的元数据。
  • -XX:MaxMetaspaceSize:元空间的最大大小。

垃圾收集器相关参数

  • -XX:+UseG1GC:启用G1垃圾收集器。
  • -XX:+UseParallelGC:启用并行垃圾收集器(年轻代)。
  • -XX:+UseConcMarkSweepGC:启用CMS垃圾收集器(老年代)。
  • -XX:NewRatio:年轻代与老年代的内存比例。
  • -XX:SurvivorRatio:Eden区与Survivor区的比例。

垃圾收集行为控制

  • -XX:MaxTenuringThreshold:对象晋升到老年代之前经历的垃圾回收次数阈值。
  • -XX:InitiatingHeapOccupancyPercent(G1 GC):触发并发标记周期的堆占用率阈值。

内存区域细分(G1收集器特定)

  • -XX:G1HeapRegionSize:设置G1堆区域的大小。

GC

  • -XX:+UseParallelGC:启用并行新生代收集器,使用多个线程进行垃圾回收。

  • -XX:ParallelGCThreads:设置并行收集器工作的线程数。

  • -Xloggc:filename:指定GC日志文件路径。

  • -XX:+PrintGCDetails:打印详细的GC处理信息。

  • -XX:+PrintGCDateStamps:在GC日志中添加时间戳。

  • -XX:NumberOfGCLogFiles-XX:GCLogFileSize:分别用于设置GC日志文件的数量和单个文件大小(滚动日志)。

栈内存大小

  • -Xss:每个线程的栈内存大小。

直接内存大小

  • -XX:MaxDirectMemorySize:设置可以使用的直接内存大小。

其他调优选项

  • -XX:+DisableExplicitGC:禁止程序主动调用System.gc()。
  • -XX:+AggressiveOpts:开启激进优化策略。
  • -XX:TargetSurvivorRatio:G1 GC的目标幸存者区占用率。

监控工具:

jstat -gccause :查看实时GC统计信息,包括引起Full GC的原因。
jinfo:动态获取或修改运行中的Java进程的JVM参数。
jmap:生成堆转储快照,用于离线分析。
jconsole 或 VisualVM:图形化监控工具,可以实时观察GC活动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot学习第十四篇:使用AOP编程

一、基本介绍 1&#xff0c;什么是 AOP &#xff08;1&#xff09;AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 &#xff08;2&#xff09;利用 AOP…

流畅的 Python 第二版(GPT 重译)(五)

第九章. 装饰器和闭包 有人对将这个功能命名为“装饰器”的选择提出了一些抱怨。主要的抱怨是该名称与其在 GoF 书中的用法不一致。 名称 decorator 可能更多地归因于其在编译器领域的用法—语法树被遍历并注释。 PEP 318—函数和方法的装饰器 函数装饰器让我们在源代码中“标记…

色环电感的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,磁芯制备:4.2,线圈绕制:5,选型参数5.1,电感值(L)5.2,电流容量(I)5.3,品质因数(Q)5.4,自谐振频率(SRF)5

windows下常用的DOS命令

DOS&#xff08;Disk Operating System&#xff09;是 Windows 操作系统中的命令行接口&#xff0c;也可以叫命令行窗口。一提到这个&#xff0c;很多初入行计算机的朋友们就是很犯怵&#xff0c;不知所错&#xff0c;好高端&#xff0c;有没有。界面如下&#xff1a; 普通用户…

【小程序开发】出行 API 汇总(一)

ty.outdoor.openOutdoorCyclingNavigation 跳转骑行导航页面 引入 import { openOutdoorCyclingNavigation } from ray-js/ray; 注意&#xff1a;当前功能仅在智慧出行App开通使用&#xff0c;需要在基础库2.15.14及以上版本使用。 参数 Object object 属性类型默认值必填…

分享一些关于在实施面试过程被问到的问题

1&#xff0c;说说你对行业现状和发展趋势的看法 一、行业现状&#xff1a; 技术创新&#xff1a;科技行业在近年来取得了显著的技术突破&#xff0c;包括人工智能、大数据、云计算、物联网等领域的发展。这些技术的创新为各行各业带来了前所未有的变革。竞争激烈&#xff1a;…

ARM与X86架构的简单剖析与未来展望

引言 在计算机硬件领域&#xff0c;ARM和X86架构无疑是两种最具影响力的处理器架构。它们各自在全球范围内应用于广泛的设备中&#xff0c;从嵌入式系统到服务器&#xff0c;再到个人电脑和移动设备&#xff0c;塑造了现代计算技术的面貌。本文将深入解析ARM与X86架构的异同&am…

【样式】Html 卡片样式

【样式】Html 卡片样式 .card {width: calc(40% - 10px);height: 160px;display: inline-block; /* 或者 flex / block 根据布局需求 */position: relative;margin: 10px; /* 添加边距以确保卡片之间有间距 */padding: 15px; /* 内边距为内容提供空间 */background-color: rgba…

【Python爬虫】将某网页中表格里的十六进制颜色值转换成十进制,再生成新表格

【需求】 在 https://www.cnblogs.com/heyang78/p/5712076.html 上有360种颜色及代码&#xff0c;但很遗憾没有十进制的RGB值&#xff0c;使用时需要自己转换一下&#xff0c;此过程依赖网络或计算器&#xff0c;颇为不便。因此&#xff0c;拟设计一爬虫将原有表格内容取出&am…

【Linux】初识进程

目录 操作系统是什么 设计操作系统的目的 操作系统的定位 如何理解管理 管理的本质 管理的例子 计算机的管理概念图 操作系统管理逻辑的六字真言 系统调用和库函数的概念 进程 进程的概念 什么是PCB&#xff1f; PCB的主要内容 如何查看进程&#xff1f; 通过系统…

NO9 蓝桥杯单片机实践之串口通信的使用

1 回顾 串口通信的代码编写结构还是与中断一样&#xff0c;不同的是&#xff1a; 初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器&#xff08;定时器1用于产生波特率&#xff09;&#xff0c;但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。 vo…

CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板

CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板 —— 杭州 2024-03-20 凌晨1:06 code review! 文章目录 CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板1.通用CMakeLists.txt模板2.GPT4给出的改进建议3.git clon…

spring boot整合elasticsearch实现查询功能

第一步、添加依赖&#xff08;注意版本对应关系&#xff09;根据spring boot版本选择合适的版本 <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.6.2</version></dependenc…

华为综合案例-普通WLAN全覆盖配置(2)

组网图 结果验证 在AC_1和AC_2上执行display ap all命令&#xff0c;检查当前AP的状态&#xff0c;显示以下信息表示AP上线成功。[AC_1] display ap all Total AP information: nor : normal [1] ExtraInfo : Extra information P : insufficient power supply ---…

wireshark抓tcp包使用指南

本博文源于笔者不断探索加上去网络总结获得的经验&#xff0c;撰写wireshark如何抓tcp包 文章目录 1、打开wireshark2、选择网络源3、搜索ip地址与tcp条件4、看灰色的条纹 1、打开wireshark 2、选择网络源 选择自己当前的ip地址适用于的网络源&#xff0c;比如这里选择“以太…

ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&…

get_local_ip.bat:快速获取IPv4地址

批处理脚本&#xff0c;用于在Windows命令提示符下获取本地计算机的IPv4地址。 echo off ipconfig | findstr IPv4 pause - echo off&#xff1a;这会关闭命令提示符窗口中的命令回显&#xff0c;使得在运行脚本时不会显示每条命令的执行结果。 - ipconfig&#xff1a;这是一…

ELK快速搭建图文详细步骤

目录 一、下载地址二、安装docker-compose(已安装则跳过)三、初始化ELK1. 赋予/setup/entrypoint.sh执行权限2. 初始化 docker-elk 所需的 Elasticsearch 用户和组3. 重置默认用户的密码4. 替换配置文件中的用户名和密码5. 重启 Logstash 和 Kibana&#xff0c;使用新密码重新连…

蓝桥杯算法基础(26)子数组最大累加和,子矩阵最大累加和

子数组最大累加和 给定一个数组arr,返回子数组的最大累加和 例:arr[1,-2,3,5,-2,6,-1];所有的子数组中[3,5,-2,6]可以累加出最大的和12&#xff0c;所以返回12static void findByForce(int[] arr){int manSumarr[0];for(int i0;i<arr.length;i){int sumarr[j];//某个元素为子…

鲁棒的基于表面势的GaN HEMT集成电路紧凑模型

来源&#xff1a;Robust Surface-Potential-Based Compact Model forGaN HEMT IC Design&#xff08;TED 13年&#xff09; 摘要 我们提出了一种精确且稳健的基于表面势的紧凑模型&#xff0c;用于模拟采用氮化镓高电子迁移率晶体管&#xff08;GaN HEMT&#xff09;设计的电…