JVM G1收集器几个重要的概念

一、可预测停顿

-XX:MaxGCPauseMillis 默认是200ms

g1的可预测停顿是如何实现的

G1垃圾收集器之所以能建立可预测的停顿时间模型,是因为他是有计划的规避了在整个JAVA堆里面进行全区域的垃圾收集。

那是如何实现的呢?

G1实现了一个合理的计算模型,这个模型能够计算出每个region的垃圾收集成本并量化,这样在给定一个停顿时间作为限制条件的情况下,模型总能计算出一组恰当的regions来作为收集目标,来达到这个限制条件,这样就能够进行实时的收集了。

二、Rset Remembered Set

讲到这个Remembered Set,那就得先说一下card table了,因为Remembered Set是在card table的基础上实现的。

what's card table

该项技术把堆划分成一个个大小512字节的卡,同时维护一张卡表,卡表记录每张卡对应的标识,这个标识是啥呢,就是记录当前的region是否有指向其他region(比如年轻代)的引用。如果有就记录一个标识。并且认为这张卡是脏的。

这样做的用处是啥呢,

背景:老年代的对象可能引用新生代的对象,那标记存活对象的时候,需要扫描老年代中的所有对象。这样成本太高了。

所以就有了card table

G1在mixed Gc的时候,会去扫码card table 而不用去扫描整个老年代的region. 将卡表里面的脏卡作为GC root对象。当完成//所有脏卡的扫描后,JVM虚拟机会吧卡表里面的脏卡标识清零。

卡表能用于减少老年代的全堆空间扫描,这能很大的提升GC效率。

其实最大的作用体现在Remembered Set, 再次回到Remembered Set,她的结构其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。他记录的信息刚好和card table是相反的。他是记录其他Region中的对象引用本Region中对象的关系(谁引用了我的对象),card table(我引用了谁的对象),

那Rset是如何辅佐GC的呢?

首先Young GC来看,只需要选定young generation region的RSet作为根集,这些RSet记录了old->young的跨代引用,避免了扫描整个old generation。

然后看一下Mixed GC, old generation中记录了old->old的RSet,young->old的引用由扫描全部young generation region得到,这样也不用扫描全部old generation region。所以RSet的引入大大减少了GC的工作量。

什么时候需要考虑从CMS或者parallelOld收集器迁移到G1呢

官方给出三个条件

1. 想要更短的GC停顿时间(超过0.5s-1s)

2. 实时数据超过了整个堆的50%

3. 对象分配率或者晋升的速度变化明显

参考文献:

弄明白CMS和G1,就靠这一篇了 - 腾讯云开发者社区-腾讯云

Java Hotspot G1 GC的一些关键技术 - 美团技术团队

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值