JVM性能参数调优

博客围绕JVM性能调优展开,介绍了性能的定义,包括吞吐量、延迟和内存占用。指出JVM性能调优重点是堆内存和GC调优,堆内存分新生区、幸存区和老年区。阐述了GC优化目标,如减少对象进入老年代和Full GC执行时间,还提及调优参数及GC执行方式。

性能的定义: 吞吐量,延迟,内存占用 比较抽象

吞吐量:不考虑GC的性能消耗,在垃圾收集器支撑应用达到最高性能的指标

延迟:缩短GC收集时间,减少因其产生的停顿

内存占用:垃圾收集器流畅执行,不产生OOM异常

 

JVM的性能调优实际上就是对内存结构中的堆内存进行调优,重点是对GC的调优。

而堆内存的结构可分为:新生区,幸存区,老年区。

那么JVM的GC优化的目标是:

1.减少对象进入老年代

2.减少FULL GC的执行时间

对象的转移过程是:

 

 

在老年代中也会有对应的算法来清理空间,也就是标记删除算法(Full GC) ,Full GC是对堆内存包括新生代和老年代的内存清除释放,Full GC是比较耗时的,如果老年代的对象特别多Full GC执行时间过长可能会引起 OOM(OutOfMemoryError)异常。堆空间溢出。

所以为了这整个过程的安全,要减少对象进入老年代,这里的话我们可以把新生代的内存空间放大一点。

 

那么这里首要调优就主要是调优参数(了解就好):

 

在进行参数调优的时候,要对GC的状态进行监控和分析,是否有调优的必要,为什么要修改,怎么修改,修改那些位置,这需要根据机器的状况和实际情况对症下药。

 

1. 设置JVM内存的参数有四个:

-Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

-Xms   Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

-Xss   每个线程的Stack大小,不熟悉最好保留默认值;

 

java启动参数共分为三类;

其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;

其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;

其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

 

首先来介绍行为参数:

 

参数及其默认值

描述

-XX:-DisableExplicitGC

禁止调用System.gc();但jvm的gc仍然有效

-XX:+MaxFDLimit

最大化文件描述符的数量限制

-XX:+ScavengeBeforeFullGC

新生代GC优先于Full GC执行

-XX:+UseGCOverheadLimit

在抛出OOM之前限制jvm耗费在GC上的时间比例

-XX:-UseConcMarkSweepGC

对老生代采用并发标记交换算法进行GC

-XX:-UseParallelGC

启用并行GC

-XX:-UseParallelOldGC

对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用

-XX:-UseSerialGC

启用串行GC

-XX:+UseThreadPriorities

启用本地线程优先级

 

上面表格中黑体的三个参数代表着jvm中GC执行的三种方式,即串行、并行、并发;

串行(SerialGC)是jvm的默认GC方式,一般适用于小型应用和单处理器,算法比较简单,GC效率也较高,但可能会给应用带来停顿;

并行(ParallelGC)是指GC运行时,对应用程序运行没有影响,GC和app两者的线程在并发执行,这样可以最大限度不影响app的运行;

并发(ConcMarkSweepGC)是指多个线程并发执行GC,一般适用于多处理器系统中,可以提高GC的效率,但算法复杂,系统消耗较大;

 

 

性能调优参数列表:

参数及其默认值

描述

-XX:LargePageSizeInBytes=4m

设置用于Java堆的大页面尺寸

-XX:MaxHeapFreeRatio=70

GC后java堆中空闲量占的最大比例

-XX:MaxNewSize=size

新生成对象能占用内存的最大值

-XX:MaxPermSize=64m

老生代对象能占用内存的最大值

-XX:MinHeapFreeRatio=40

GC后java堆中空闲量占的最小比例

-XX:NewRatio=2

新生代内存容量与老生代内存容量的比例

-XX:NewSize=2.125m

新生代对象生成时占用内存的默认值

-XX:ReservedCodeCacheSize=32m

保留代码占用的内存容量

-XX:ThreadStackSize=512

设置线程栈大小,若为0则使用系统默认值

-XX:+UseLargePages

使用大页面内存

 我们在日常性能调优中基本上都会用到以上黑体的这几个属性; 

 

调试参数列表:

参数及其默认值

描述

-XX:-CITime

打印消耗在JIT编译的时间

-XX:ErrorFile=./hs_err_pid<pid>.log

保存错误日志或者数据到文件中

-XX:-ExtendedDTraceProbes

开启solaris特有的dtrace探针

-XX:HeapDumpPath=./java_pid<pid>.hprof

指定导出堆信息时的路径或文件名

-XX:-HeapDumpOnOutOfMemoryError

当首次遭遇OOM时导出此时堆中相关信息

-XX:

出现致命ERROR之后运行自定义命令

-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

当首次遭遇OOM时执行自定义命令

-XX:-PrintClassHistogram

遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同

-XX:-PrintConcurrentLocks

遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同

-XX:-PrintCommandLineFlags

打印在命令行中出现过的标记

-XX:-PrintCompilation

当一个方法被编译时打印相关信息

-XX:-PrintGC

每次GC时打印相关信息

-XX:-PrintGC Details

每次GC时打印详细信息

-XX:-PrintGCTimeStamps

打印每次GC的时间戳

-XX:-TraceClassLoading

跟踪类的加载信息

-XX:-TraceClassLoadingPreorder

跟踪被引用到的所有类的加载信息

-XX:-TraceClassResolution

跟踪常量池

-XX:-TraceClassUnloading

跟踪类的卸载信息

-XX:-TraceLoaderConstraints

跟踪类加载器约束的相关信息

 

详细叙述可参考https://blog.youkuaiyun.com/weixin_33979745/article/details/86109034

 

 

 

 

 

JVM 参数的方法和技巧主要围绕核心参数、高级技巧等方面展开,以下是详细介绍: ### 核心参数详解 #### 堆内存设置 稳定的堆大小对垃圾回收有利,可通过设置 `-Xmx` 和 `-Xms` 为相同的值来获得稳定堆大小。若想让堆大小在一个区间内震荡,在系统不需要使用大内存时压缩堆空间,使 GC 应对较小的堆以加快单次 GC 的速度,JVM 提供了相关参数用于压缩和扩展堆空间[^2]。 示例代码: ```plaintext java -Xmx512m -Xms512m YourMainClass ``` #### 选择合适的 GC 算法(GC 收集器) 在 JDK 17+ 推荐使用 G1 收集器。不同的 GC 算法适用于不同的场景,例如,CMS 收集器适用于对响应时间要求较高的场景,而 G1 收集器则更适合大内存、多 CPU 的环境[^1]。 示例代码: ```plaintext java -XX:+UseG1GC YourMainClass ``` #### 化分代比例(非 G1 时) 在非 G1 收集器的情况下,需要对新生代和老年代的比例进行化,以提高垃圾回收的效率。 示例代码: ```plaintext java -XX:NewRatio=2 YourMainClass ``` 上述代码表示老年代与新生代的比例为 2:1。 #### 触发 Full GC 的关键点 了解触发 Full GC 的条件,如老年代空间不足、永久代(JDK 8 之前)或元空间(JDK 8 及以后)空间不足等,并通过整相关参数来避免不必要的 Full GC。 ### 高级技巧 #### 避免大对象直接进老年代 大对象直接进入老年代可能会导致老年代空间不足,从而触发 Full GC。可以通过设置 `-XX:PretenureSizeThreshold` 参数,让大于该值的对象直接在新生代分配。 示例代码: ```plaintext java -XX:PretenureSizeThreshold=1048576 YourMainClass ``` 上述代码表示大于 1MB 的对象直接在新生代分配。 #### G1 化建议 对于使用 G1 收集器的场景,可以通过整 `-XX:MaxGCPauseMillis` 参数来控制最大垃圾回收停顿时间。 示例代码: ```plaintext java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 YourMainClass ``` 上述代码表示设置 G1 收集器的最大垃圾回收停顿时间为 200 毫秒。 #### 减少 STW 停顿 通过整相关参数,如使用并行或并发的垃圾回收器,来减少 Stop-The-World(STW)停顿时间,提高应用的响应性能。 #### 容器环境(Docker/K8s) 在容器环境中,需要根据容器的资源限制来合理JVM 参数,避免 JVM 过度占用资源。 ### 注意事项 JVM 没有万能公式,需要结合具体应用、硬件、GC 算法等进行。在进行时,应先明确目标,通过监控与诊断工具定位瓶颈,然后对关键指标进行解读,再进行针对性的参数整[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值