jvm GC参数调优

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm GC参数调优相关的知识,希望对你有一定的参考价值。

参考技术A (本篇主要以CMS-GC为主,如果对G1感兴趣的我后面也可以补充)

1.1 jvm启动参数分为三类:

1.2 jvm内存相关的配置

1.3 GC收集器相关的配置

1.4 通用参数相关的配置

1.5 CMS重要配置参数

1.6 日志输出相关配置参数

众所周知CMS-GC是采用标记清除算法, CMS-GC主要分成7个步骤:

其中5个阶段(名字以Concurrent开始的)与实际的应用程序是并发执行的,而其他2个阶段需要暂停应用程序线程(STW), 而且STW时间主要耗时在remark阶段(大约占了80%)

下面是我截的一台应用服务器当时的GC日志图, 我们的告警里面的STW时间实际是统计只有remark阶段的耗时,其实并没有统计初始标记阶段的耗时,严格意义上来说是不准确的,换句话来说实际我们的STW时间更长远超了810毫秒.

其实从耗时上我们可以看出, 主要耗时在处理引用上面,看JVM源码,weak refs processing主要包括SoftReference、WeakReference、FinalReference、PhantomReference以及JNI Weak Reference这五种Reference对象的处理,处理的主要内容是对之前标记的Reference对象重新处理,重新判断是否需要标记(不标记就是要回收的),如果不标记就需要放到refqueue里,等待java ReferenceHandler线程处理。
所以从工作的主要内容看各种Reference的处理时间跟reference的个数成正比。那么接下来我们需要做的是确定是哪种Reference比较耗时,然后进行针对性优化。所以加了个参数-XX:+PrintReferenceGC,来具体显示各种Reference的个数和处理时间。

如果是对于大内存的服务, 比如你的服务器是16G、32G其实完全可以用G1, 目前G1也是java9默认的垃圾回收器,G1在内存不吃紧的情况下会可以做到灵活回收和大大降低大堆停顿.

以上是关于jvm GC参数调优的主要内容,如果未能解决你的问题,请参考以下文章

常用jvm参数配置

JVM层GC调优(下)

JVM性能调优(2) —— 内存设置和查看GC日志

jvm调优具体参数配置

jvm - 常用调优启动参数配置

03JVM调优调优--2.基础:参数说明(堆参数说明),垃圾收集器(前置知识:垃圾回收算法,GC种类),垃圾收集器(种类,相关介绍)