JVM垃圾收集器介绍(二)-G1

G1垃圾收集器

G1(Garbage-First):此垃圾收集器跟CMS的垃圾收集过程很相似,但是G1垃圾收集器不存在年轻代和老年代的严格的内存大小划分,只是在逻辑上还保留年轻代、老年代,同时增加了大对象区(针对占用内存较大的对象独立存放),其主要结构图为:
在这里插入图片描述从图中可以看出每个类型的内存都可以不连续,图中每个小格子就是一块内存区域region,默认region为2M,可通过参数-XX:G1HeapRegionSize进行调整region大小(不建议),故格子的个数=堆内存/region的大小,例如堆内存4096M,默认的region2M,则内存region个数为2048个,针对年轻代eden:s1:s2的内存占比默认还是8:1:1,年轻代的初始内存默认为5%,如果堆内存4096M,差不多年轻代初始占200M,region100个,eden80个,s1 10个,s2 10个,当然年轻代的内存占比可以调整,通过参数-XX:G1MaxNewSizePercent,但不能超过堆内存的60%。针对G1垃圾收集器增加了大对象的存储,当进来的对象超过region大小的50%,即会进入到Humongus区域中。

收集过程

1) 初始标记:与CMS的初始标记是一致的(针对CMS介绍请看上一篇文章);
2) 并发标记:与CMS的过程一致;
3) 最终标记:与CMS的过程一致;
4) 筛选回收:此处是与CMS的最大不同,也是G1为了提高用户体验的优化手段,此步骤也是STW,G1可以设置STW的时间,在垃圾回收的时候,会维护一个回收标记表,若老年代中有1000个region已经满了,根据设置的STW时间100ms,只能回收80%的区域,则此次垃圾回收就只回收80%的区域对象。且对垃圾回收对象进行评估,选择回收率高的内存对象,例如:一块内存区域花100ms能回收20M垃圾对象,而另一块区域可以回收100M的垃圾对象,则会优先收集回收多的对象进行回收。
在这里插入图片描述

Young gc-Mixed gc

垃圾收集算法是采用的标记-复制法,具体说明请看上篇文章
1)Young Gc:Young Gc触发的动作不仅仅查看eden区的内存,还会计算回收对象的STW时间,若时间远小于设置的时间,则会扩大eden区的内存,也就是将对象放入新的region里,当计算的STW时间相近设置的时间则会进行Young Gc的操作。
2)Mixed Gc:此Gc不是full gc,老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,主要对年轻代、old区(根据设置的STW的时间回收尽可能多的对象)及Humongus大对象区域进行回收,因为此垃圾收集器算法采用的是标记复制算法,故要有可用的region区域,若复制的时候发现没有足够的空间则会触发full gc。STW然后单线程进行标记、清理,清理出来的region用于mixed gc使用。这个过程是非常耗时的。

使用场景

1) 用户体验要求很高的,即停顿时间需要特别短的(在几百毫秒);
2) 内存在8G以上的;
3) 50%以上的堆被存活对象占用;
4) 对象的分配和晋升速度变化大(类似kafka消费场景);
5) 垃圾回收时间长,秒级以上。

部分参数

1)-XX:+UseG1GC:使用G1收集器
2)-XX:ParallelGCThreads:指定GC工作的线程数量
3)-XX:G1HeapRegionSize:指定region大小,必须是2的次幂
4)-XX:MaxGCPauseMillis:STW时间(默认200ms)
5)-XX:G1NewSizePercent:年轻代内存初始空间(默认整堆5%)
6)-XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC)
7)-XX:MaxTenuringThreshold:分代年龄阈值(默认15)针对eden、s1、s2循环次数进入到old区
8)-XX:G1MaxNewSizePercent:最大的年轻代内存空间

注意事项

因G1的最大特点是可以设置-XX:MaxGCPauseMillis STW时间,所以要注意尽量避免young gc频繁的同时也要考虑多少存活对象进入到老年代,避免频繁触发mixed gc,故在设置时间时,需评估系统产生对象的频率、大小、存活时长等,作出合理的STW时间设定。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值