上节讲解:
本节讲解:G1垃圾收集器有哪些参数?如何设置优化及特点。
G1垃圾回收器的一些常用参数1、"-XX:G1MixedGCCountTarget"参数
一般在老年代的Region占据了堆内存的Region的45%之后,会触发一个混合回收的过程,也就是Mixed GC,分为了好几个阶段进行混合回收,从新生代和老年代里都回收一些Region。为满足设置的停顿时间设置,混合回收的时候,其实会停止所有程序运行,所以说G1是允许执行多次混合回收的。这个参数就是在一次混合回收的过程中,最后一个阶段执行几次混合回收,默认值是8次。
假设一次混合回收预期要回收掉一共有160个Region,那么此时第一次混合回收,会回收掉一些Region,比如就是 20个Region需要花配置的时间200ms。如此反复执行8次混合回收阶段之后 ,不就把预订的160个Region都回收掉了?而且还把系统停顿时间控制在指定范围内。
2、"-XX:G1HeapWastePercent"参数
默认值是5%意思就是说,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉。如下图
这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了老年代可用内存的5%,此时就会 立即停止混合回收,意味着本次混合回收就结束了。就进行年轻代回收就OK了。这个参数,我觉得应该可以适当提高,避免万一真的遇到了高峰期,短期存活对象进入老年代,但是回收的时候,进行了几次混合回收的时候, 刚好达到了5%,但是在老年代Region中可能还是存在某些短期存活对象没有被回收。过早结束混合回收。
3、"-XX:G1MixedGCLiveThresholdPercent"参数
他的默认值是85%,意思就是确定要回收的Region的时候,必须是存活对象低于85%的Region才可以进行回收,否则要是一个Region的存活对象多余85%,你还回收他干什么?这个时候要把85%的对象都拷贝到别的Region,这个成本是很高的。
回收失败时的Full GC如果在进行Mixed回收的时候,无论是年轻代还是老年代都基于复制算法进行回收,都要把各个Region的存活对象拷贝到别的Region里去,此时万一出现拷贝的过程中发现没有空闲Region可以承载自己的存活对象了,就会触发一次失败。一旦失败,立马就会切换为停止系统程序,然后采用单线程进行标记、清理和压缩整理,空闲出来一批Region,这个过程是极慢极慢的。
G1收集器的特点并行与并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个 CPU(CPU或者CPU核心)来缩短 Stop The World 停顿时间。部分其他收集器原本需要停顿java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。
分代收集:虽然 G1 可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。
空间整合:与 CMS 的"标记--清理"算法不同,G1从整体来看是基于"标记整理"算法实现的收集器;从局部上来看是基于"复制"算法实现的。
可预测的停顿:这是G1相对于 CMS 的另一个大优势,降低停顿时间是 G1 和 CMS 共同的关注点,但是 G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为 M 毫秒的时间片段内。
动态分配内存:这是G1的另一个大优势,我们不用关心内存如何分配老年代、年轻代的大小,G1帮我们实现了动态分配,合理的使用内存。
下节讲解: JMM java内存模型相关知识点。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved