HiSEN

Java HotSpot 虚拟机 CMS、G1 参数设置记录

零、背景说明

目前测试机器为 4C8G
两台机器完全处理一样的工作
大部分时间对象朝生夕死,很少进入老年代
CMS 指定了新生代最大 1536M,略微有点浪费
于是设置 G1 自动调节各个区域大小能否有所改善
也因为最近看了两本 JVM 相关的书籍,拿着锤子锤两下看看

一、G1 设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-Xms4096M
-Xmx4096M
-XX:+UseG1GC
-XX:+UnlockDiagnosticVMOptions
-XX:SurvivorRatio=8
-XX:+ParallelRefProcEnabled
-XX:MaxTenuringThreshold=6
-XX:ParGCCardsPerStrideChunk=4096
-XX:MaxGCPauseMillis=100
-XX:MaxMetaspaceSize=256M
-XX:MetaspaceSize=256M
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:/home/hisen/gc.log

二、CMS 设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-Xms4096M
-Xmx4096M
-Xmn1536M
-XX:SurvivorRatio=8
-XX:MaxMetaspaceSize=256M
-XX:MetaspaceSize=256M
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+ParallelRefProcEnabled
-XX:+CMSScavengeBeforeRemark
-XX:MaxTenuringThreshold=6
-XX:+UnlockDiagnosticVMOptions
-XX:ParGCCardsPerStrideChunk=4096
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:/home/hisen/gc.log

三、结果对比

TypeDurationXmnYGC countYGC avgInterval Time
G172 hrs 21 min 8 sec1.66G759619.6 ms34 sec 294 ms
CMS70 hrs 24 min 51 sec1.5G702914.4 ms36 sec 68 ms

目前应用堆响应时间比较敏感,追求低延迟。
就上表来看,G1 新生代的大小确实上去了,但并不尽如人意。
但是随着而来的是 G1 『更频繁的YGC』以及『更长的停顿时间』
在《深入理解JVM虚拟机》第三版看到,
由于 G1 处理跨 region 需要耗费额外 10% ~ 20% 的资源,小堆(堆大小<8G)上没有优势。

JVM 新生代大小与老年代大小默认为 1:2,
大部分应用按这个设置是 OK 的,
虽然有时候看着老年代一直很小,
设置那么大浪费内存,但是当调用量大的时候,就能派上用场,减少 Full GC。

先占个坑,后续继续填内容。