Java大头:垃圾收集器(三)

前言:Garbage-First收集器主要应用在配备大内存,多核处理器的机器上面。他以高概率满足垃圾收集暂停时间目标,同时在几乎不需要配置的情况下实现高吞吐量。G1 旨在使当前应用程序和环境在停顿和吞吐量之间提供最佳平衡。

一,堆组成与布局
在这里插入图片描述
图中:浅灰色代表空白,红色代表Eden区,红色+S代表Survivor区,蓝色代表老年代,蓝色+H代表Humongous(专门存放大对象的区域)。

由上图我们可以知道G1将我们堆区域或分成许多小格子(Region),Region的大小都相等,最多可以有2048个Region。Regsion的大小可以通过参数指定,默认是2M(必须是2的次幂,有效值为 1 到 32 MB)。

-XX:G1HeapRegionSize  //指定Region大小

相比较于之前聊过的收集器,G1虽然也保留了年轻代和老年代的概念,但是不再是连续的内存空间了。而且Region的角色是可以变化的,所以他即可以是年轻代,也可以转换成老年代。还有一点不同的是,G1的对于大对象有一块专门的区域保存(Humongous区),当一个对象的大小超过了一个Region的50%,就会被放过Humongous中,而且如果对象特别大时,可以横跨多个Region存放。而且G1可以设置最大暂停时间(最大STW的时间)

-XX:MaxGCPauseMillis=200 //此值设置要合理,否则会起到反效果

二,回收过程步骤
在这里插入图片描述

1. 初始标记(Initial Marking):暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快 ;
2. 并发标记(Concurrent Marking):用户线程不中断,同时进行可达性分析(同CMS垃圾收集器);
3. 最终标记(Remark):标记在上步骤过程中发生变化的对象(同CMS垃圾收集器);
4. 筛选回收(Cleanup):这里就与CMS有区别了,因为G1是可以设置Gc停顿时间的,所以此阶段G1会对各个Region的回收价值和成本进行计算和排序,尽量在设置的停顿的时间内最大化进行垃圾回收。(比如有1000个Region可以进行回收,但是在设置的STW时间内,只能最多回收800个,那么把800个Region回收掉,这样其实就是以空间换时间了);在CMS垃圾收集器中,回收阶段是可以与用户线程并行的,但是G1目前需要STW。

三,G1的收集模式

  1. Young Gc
    Young Gc在所有的Eden区都存放满了之后,会对本次回收做一个时间预估,如果时间比设置的最大gc停顿时间小得多,那么不会马上进行Eden区的回收,而是增加Region给到Eden区,直到近似达到gc最大停顿时间或者Eden区大小达到了最大阈值就会触发gc(默认年轻代对堆内存的占比是5%,最多不超过60%)
-XX:G1NewSizePercent=5
-XX:G1MaxNewSizePercent=60
  1. Mixed Gc
    当老年代的占有率达到设定的值会触发,他会回收所有的Young和部份old,还有大对象区。Mixed Gc主要使用复制算法,把Region中存活的对象复制到别的Region中去,如果复制过程没有足够的Region,则会触发一次full gc。

四,G1常用设置参数
在这里插入图片描述

五,G1适用场景

  1. 如果堆内存在8G或16的,建议使用G1
  2. 想自主确定STW时间可以使用G1(G1的优势)
  3. 垃圾回收时间长(注意不是STW),可以使用G1
  4. 对象分配率或年轻代升级老年代很频繁
  5. 如果JDK9版本建议使用G1,当然默认也是G1。

总结:从G1回收的步骤我们不难看出,G1应该是在CMS的理论基上进一步改造,使其更加亲和于用于的体验。尤其是他可以通过参数控制最大STW的时间,这一点算是区别于之前几节讲到的收集器的最大不同之处。当然他的实现过程肯定也就越复杂。所以本篇也只能算是G1入门级的文章,还有待深入探究。我是阿雷,父亲节快乐。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值