JVM(6)—— G1垃圾回收器

1. G1垃圾回收器的工作原理

ParNew + CMS的组合,无论是新生代垃圾回收,还是老年代垃圾回收,都会或多或少产生“Stop the World”现象,对系统的运行是有一定影响的。 G1可以做到让你来设定垃圾回收对系统的影响,他自己通过把Java堆内存拆分为多个大小相等的Region,以及追踪每个Region中可以回收的对象大小和预估时间,最后在垃圾回收的时候,尽量把垃圾回收对系统造成的影响控制在你指定的时间范围内,同时在有限的时间内尽量回收尽可能多的垃圾对象。

2. G1垃圾回收器

G1垃圾回收器是可以同时回收新生代和老年代的对象的 ,他最大的一个特点,就是把Java堆内存拆分为多个大小相等的Region, 可以让我们设置一个垃圾回收的预期停顿时间.

Region可能属于新生代也可能属于老年代

每个Region都有回收价值

3. 新生代还有Eden和Survivor的概念吗?

还是有新生代、老年代的区分 ,

4. 如何设定G1对应的内存大小 ?到底有多少个Region呢?每个Region的大小是多大呢?

整个堆内存设置一个大小,比如说用“-Xms”和“-Xmx”来设置堆内存的大小。

默认情况下自动计算和设置的 , 可以使用“-XX:+UseG1GC”来指定使用G1垃圾回收器,此时会自动用堆大小除以2048

默认新生代对堆内存的占比是5%

因为JVM最多可以有2048个Region,然后Region的大小必须是2的倍数,

“ -XX:SurvivorRatio=8”,所以这里还是可以区分出来属于新生代的Region里哪些属于Eden,哪些属于Survivor。 比如新生代之前说刚开始初始的时候,有100个Region,那么可能80个Region就是Eden,两个Survivor各自占10个Region

5. G1的新生代垃圾回收

随着不停的在新生代的Eden对应的Region中放对象,JVM就会不停的给新生代加入更多的Region,直到新生代占据堆大小的最大比例60%。 这个时候还是会触发新生代的GC,G1就会用之前说过的复制算法来进行垃圾回收,进入一个“Stop the World”状态 , 然后把Eden对应的Region中的存活对象放入S1对应的Region中,接着回收掉Eden对应的Region中的垃圾对象 . 这个过程 可以设定目标GC停顿时间的, 就是G1执行GC的时候最多可以让系统停顿多长时间,可以通过“-XX:MaxGCPauseMills”参数来设定,默认值是200ms。

6. 对象什么时候进入老年代?
  1. 对象在新生代躲过了很多次的垃圾回收,达到了一定的年龄了,“-XX:MaxTenuringThreshold”参数可以设置这个年龄,他就会进入老年代
  2. 动态年龄判定规则,如果一旦发现某次新生代GC过后,存活对象超过了Survivor的50%
7.大对象Region

G1提供了专门的Region来存放大对象,而不是让大对象进入老年代的Region中。 在G1中,大对象的判定规则就是一个大对象超过了一个Region大小的50% 会被放入大对象专门的Region中

8. 大对象既然不属于新生代和老年代,那么什么时候会触发垃圾回收呢?

新生代、老年代在回收的时候,会顺带带着大对象Region一起回收,所以这就是在G1内存模型下对大对象的分配和回收的策略。

9. 什么时候触发新生代+老年代的混合垃圾回收?

G1有一个参数,是“-XX:InitiatingHeapOccupancyPercent”,他的默认值是45%,如果老年代占据了堆内存的45%的Region的时候,此时就会尝试触发一个新生代+老年代一起回收的混合回收阶段。

10. 老年代G1垃圾回收的过程
  1. 初始标记
    这个过程是需要进入“Stop the World”的,仅仅只是标记一下GC Roots直接能引用的对象,这个过程速度是很快的。
  2. 并发标记
    这个阶段会允许系统程序的运行,同时进行GC Roots追踪,从GC Roots开始追踪所有的存活对象, 并发标记阶段还是很耗时的,因为要追踪全部的存活对象。 对系统程序的影响不太大。
  3. 最终标记
    这个阶段会进入“Stop the World”,系统程序是禁止运行的,但是会根据并发标记 阶段记录的那些对象修改,最终标记一下有哪些存活对象,有哪些是垃圾对象
  4. 混合回收
    这个阶段会计算老年代中每个Region中的存活对象数量,存活对象的占比,还有执行垃圾回收的预期性能和效率。 接着会停止系统程序,然后全力以赴尽快进行垃圾回收,此时会选择部分Region进行回收,因为必须让垃圾回收的停顿时间控制在我们指定的范围内。 老年代对堆内存占比达到45%的时候,触发的是“混合回收”, 也就是说,此时垃圾回收不仅仅是回收老年代,还会回收新生代,还会回收大对象。
    假如设定了对GC停顿时间的目标,所以说他会从新生代、老年代、大对象里各自挑选一些Region,保证用指定的时间(比如200ms)回收尽可能多的垃圾,这就是所谓的混合回收
11 G1垃圾回收器的一些参数
  1. 比如“-XX:G1MixedGCCountTarget”参数,就是在一次混合回收的过程中,最后一个阶段执行几次混合回收,默认值是8次
  2. -XX:G1HeapWastePercent”,默认值是5% , 一旦空闲出来的Region数量达到了堆内存的5%,此时就会 立即停止混合回收,意味着本次混合回收就结束了。
  3. “-XX:G1MixedGCLiveThresholdPercent” , 默认值是85%,意思就是确定要回收的Region的时候,必须是存活对象低于85%的Region才可以进行回收
12 回收失败时的Full GC

进行Mixed回收的时候,**无论是年轻代还是老年代都基于复制算法进行回收,**都要把各个Region的存活对象拷贝到别的Region里去, 此时万一出现拷贝的过程中发现没有空闲Region可以承载自己的存活对象了,就会触发 一次失败。 一旦失败,立马就会切换为停止系统程序,然后采用单线程进行标记、清理和压缩整理,空闲出来一批Region,这个过程是极慢极慢的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值