JVM的G1垃圾回收器

1.G1

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量的性能特征。

1.1 G1区域Region划分

G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数指定region的大小。

G1保留了年轻代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连续)Region的集合。默认年轻代对堆内存的占比是5%,年轻代中的Eden和 Survivor对应的region也跟之前一样,默认8:1:1。

一个Region可能之前是年轻代,如果Region进行了垃圾回收,之后可能又会变成老年代,也就是说Region的区域功能可能会动态变化。

什么事大对象?大对象的判定规则就是一个大对象超过了一个Region大小的50%。如果一个大对象太大,可能会横跨多个Region来存放该对象。

G1有专门分配大对象的Region区域,叫Humongous区,而不是让大对象直接进入老年代的Region中。

Full GC的时候除了收集年轻代和老年代之外,也会将Humongous区一并回收。

 1.2 G1实现流程

1.初始标记(STW):暂停所有的其他线程,并记录下gc roots直接能引用的对象,速度很快;

2.并发标记:同CMS;

3.最终标记(STW):同CMS;

4.筛选回收(STW):筛选回收阶段,首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。每次可能只回收一部分Region。回收算法主要用的是复制算法,将一个region中的存活对象复制到另一个region中,这种不会像CMS那样回收完因为有很多内存碎片还需要整理一次,G1采用复制算法回收几乎不会有太多内存碎片。(CMS这个阶段是和用户线程并发进行的)(G1回收花费的时间主要是在复制算法上)

1.3 G1的优先列表

G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region(这也就是它的名字Garbage-First的由来),比如一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,在回收时间有限情况下,G1当然会优先选择后面这个Region回收。

1.4 G1的优势

可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段(通过参数"- XX:MaxGCPauseMillis"指定)内完成垃圾收集。

1.5 G1的垃圾收集分类

1.YoungGC

YoungGC并不是说现有的Eden区放满了就会马上触发,G1会计算下现在Eden区回收大概要多久时间,如果回收时间远远小于参数 -XX:MaxGCPauseMills 设定的值,那么增加年轻代的region,继续给新对象存放,不会马上做Young GC,直到下一次Eden区放满,G1计算回收时间接近参数 -XX:MaxGCPauseMills 设定的值,那么就会触发Young GC。

2.MixedGC

不是FullGC,老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,回收所有的Young区和部分Old区(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区,正常情况下,G1的垃圾收集是先做MixedGC,主要使用复制算法,需要把各个region中存活的对象拷贝到别的region里去,拷贝过程中如果发现没有足够的空region能够承载拷贝对象,就会触发一次Full GC。

3.FullGC

停止系统程序,然后采用单线程进行标记、清理和压缩整理,为的是空闲出来一批Region来供下一次MixedGC使用,这个过程是非常耗时的。(Shenandoah收集器优化成多线程收集了)

1.5G1的应用场景

1.8GB以上的堆内存(建议值)

2.适合大内存的机器

1.6G1优化建议

核心还是在于调节 -XX:MaxGCPauseMills 这个参数的值,在保证他的年轻代gc别太频繁的同时,还得考虑每次GC过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发mixed gc。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值