G1的暂停预测模型是怎么做到的
1. G1垃圾收集器停顿预测模型
G1收集器突出表现出来的一点是通过一个停顿预测模型根据用户配置的停顿时间来选择Cset的大小,从而达到用户期待的应用程序暂停时间
通过-XX:MaxGCPauseMillis
参数来设置,这一点有点类似于Parallel Scavenge收集器.关于停顿时间的设置并不是越短越好
- 设置的时间越短意味着每次收集的Cset越小,导致垃圾逐步积累变多,
最终不得不退化成Serial GC
; - 停顿时间设置的过长,那么会导致每次都会产生长时间的停顿,影响了程序对外的响应时间
2 相关实践
2.1 不断调优暂停时间指标
通过-XX:MaxGCPauseMillis=x
可以设置启动应用程序的暂停时间, G1在运行的是会根据这个参数选择Cset来满足响应时间的设置
一般情况下这个值设置到100ms和200ms都是可以的(不同情况下会不一样), 但是如果设置成50ms就不太合理
暂停的时间设置的太短,就会导致出现G1跟不上垃圾产生的速度,最终退化成Full GC
所以对这个参数的调优是一个持续的过程,逐步调整到最佳状态
2.2 不要设置新生代和老年代的大小
-
G1收集器在运行的时候回调整新生代和老年代的大小
通过改变代的大小来调整对象晋升的速度以及晋升年龄,从而达到我们为收收集器设置的暂停时间目标 -
设置了新生代的大小相当于放弃了G1为我们做的自动调优,我们需要做的只是设置这个堆内存的大小,剩下的就交给G1自己去分配各个代的大小即可
2.3 关注Evacaution Failure
其类似于CMS里面的晋升失败
, 堆空间的垃圾太多导致无法完成Region之间的拷贝,于是不得退化成Full GG来做一次全局范围内的垃圾回收