零、背景说明
目前测试机器为 4C8G
两台机器完全处理一样的工作
大部分时间对象朝生夕死,很少进入老年代
CMS 指定了新生代最大 1536M,略微有点浪费
于是设置 G1 自动调节各个区域大小能否有所改善
也因为最近看了两本 JVM 相关的书籍,拿着锤子锤两下看看
一、G1 设置
1 | -Xms4096M |
二、CMS 设置
1 | -Xms4096M |
三、结果对比
Type | Duration | Xmn | YGC count | YGC avg | Interval Time |
---|---|---|---|---|---|
G1 | 72 hrs 21 min 8 sec | 1.66G | 7596 | 19.6 ms | 34 sec 294 ms |
CMS | 70 hrs 24 min 51 sec | 1.5G | 7029 | 14.4 ms | 36 sec 68 ms |
目前应用堆响应时间比较敏感,追求低延迟。
就上表来看,G1 新生代的大小确实上去了,但并不尽如人意。
但是随着而来的是 G1 『更频繁的YGC』以及『更长的停顿时间』
在《深入理解JVM虚拟机》第三版看到,
由于 G1 处理跨 region 需要耗费额外 10% ~ 20% 的资源,小堆(堆大小<8G)上没有优势。
JVM 新生代大小与老年代大小默认为 1:2,
大部分应用按这个设置是 OK 的,
虽然有时候看着老年代一直很小,
设置那么大浪费内存,但是当调用量大的时候,就能派上用场,减少 Full GC。
先占个坑,后续继续填内容。