G1混合回收及一些参数的设置

G1在什么时候会触发新生代和老年代的混合GC呢,有一个参数可以控制,就是 -XX:InitiatingHeapOccupancyPercent,默认值是45,也就是老年代占据了堆内存45%的Region的时候。

混合回收的步骤有点类似于CMS垃圾回收器的回收步骤,具体步骤如下:

  1. 初始标记

这个阶段需要STW(Stop the World),会停止所有的工作线程,然后标记所有GC Roots直接引用的对象。这个阶段虽然会停止工作线程,但是标记GC Roots直接引用的对象速度非常块,所以影响很小。

  1. 并发标记

这个阶段工作线程和垃圾回收线程会一起工作,垃圾回收线程会将那些GC Roots可达的对象都标记出来。JVM会对并发标记阶段的修改记录下来,比如工作线程创造新的对象,和一些存活的对象失去引用,变成了垃圾对象。这个阶段是最耗时的阶段,因为是对老年代所有的对象进行GC Roots追踪,但是因为工作线程也在同时运行,所以不会让系统停顿。

  1. 最终标记

这个阶段会STW,然后根据并发标记阶段的并发修改记录,最终标记出哪些对象是存活对象,哪些对象是垃圾对象

  1. 混合回收

这个阶段会计算老年代中每个Region中存活对象的数量,存活对象的占比,还有执行垃圾回收的预期性能和效率。接着会STW,进行垃圾回收,并将回收时间控制在我们设定的预期停顿时间之内。

混合回收回收的不仅是老年代,还有新生代和大对象。G1会从新生代,老年代和大对象中选择一部分的Region,尽可能多的回收垃圾对象。G1中有一个参数 -XX:G1MixedGCCountTarget,默认为8,这个参数标识最后的混合回收阶段会执行8次,一次只回收掉一部分的Region,然后系统继续运行,过了一小段时间之后,又再次进行混合回收,重复8次。执行这种间断的混合回收,就可以把每次的混合回收时间控制在我们需要的停顿时间之内了,同时达到垃圾清理的效果。

还有一个参数 -XX:G1HeapWastePercent,默认为5,它的意思是在混合回收的时候,Region都是基于复制算法去垃圾回收的,将一个Region内的存活对象放入另一个Region中,再把这个Region的垃圾对象给清理掉,这样就不会产生内存碎片了。清理掉垃圾对象的Region会不断的空闲出来,一旦达到了堆内存的5%,就会停止该次的混合回收。

下一个参数 -XX:G1MixedGCLiveThresholdPercent,默认值为85,意思是如果一个Region中的存活对象大于Region大小的85%的话,就不去回收这个Region,否则回收时将85%的存活对象放入另一个Region中,得不偿失。

在进行混合回收的时候,无论时年轻代还是老年代都是基于复制算法去回收Region的,一旦出现Region拷贝的过程中没有空闲的Region可以存放存活对象的时候,就会触发一次失败。然后停止工作线程,切换为单线程进行标记,清理和压缩整理,空闲出一部分的Region,这个过程会非常慢,所以要尽量避免这种情况的发生。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值