0
点赞
收藏
分享

微信扫一扫

JVM垃圾回收器G1的回收过程

惠特曼 2022-04-26 阅读 80
java

回收使用的数据结构

Remembered Set记忆集
CardTable卡表

Remembered Set(以下简称RSet)
RSet是每一个Region中为了提高垃圾回收扫描的效率所分配的一个区。该区主要记录其他Region引用该Region的信息,然后通过该RSet中的信息找到其他引用该Region的域,这样子的话就可以在回收的时候不用全部扫描整个堆了因为如果没有使用该RSet的话,要知道谁引用了该Region,只能通过扫描所有的堆,然后才能得出,这样的执行效率太低,因此使用了RSet你可以极大地增加了效率。并且RSet底层是使用HashTable实现存储的。
具体如图
在这里插入图片描述
CardTable
CardTable(以下简称CT),CT是一个数组,数据类型为byte,指向Region中的Card,一个CT将一个Region分配成为若干个物理上连续的区域(每一个128-512),主要作用是通过RSet指向CT中具体所要寻找的Region区,然后通过CT指向Region中的具体区。CT数组中的下标对应Region中的某一个区,当该区域被外界的Region引用的的时候CT中对应该空间的下标地址的值就会变为0,变为0表示“变脏”,表示被脏引用了。因为是可以多线程进行修改,所以为了避免并发修改RSet对应Region中的值,因此RSet使用HashTable实现,每一个线程只能在自己的HashTable中修改该线程的RSet的值。
在这里插入图片描述
Rset写屏障
写屏障是RSet的一个很重要的概念,相当于在对Reference引用类型执行写操作的时候,都会执行写屏障操作,主要检查引用该对象的所在的Region是否和当前对象在同一个Region中,如果不是的话就对Rset写入引用对象Region的信息,否则不会进行写入(因为在回收的时候,都要进行该Region扫描,那么在同一个Region内就不必要进行添加了)

G1的回收过程
1.G1 YoungGC(具体有五个步骤,就不在这里讲解了)
2.Mixed GC
当老年代的空间超过整堆比IHOP(InitiatingHeapOcupancyPercent)的时候,G1就会启动一次Mixed GC,Mixed GC主要回收新生代和一部分老年代

Mixed GC的回收
1.全局并发扫描

  • 初始标记:标记处所有跟GC Roots直接关联的对象,这一阶段STW,并且耗时很短,主要是修改TAMS指针的值,让下一阶段分配对象能够使用Region内存
  • 根区域扫描:扫描初始标记中存活并且能够直达老年代的对象,该阶段是并发执行,耗时较长,并且只有完成该阶段以后才能进行下一阶段的STW的Young GC
  • 并发标记:从GC Roots对堆中的对象进行可达性分析, 找出存活的对象,并发标记阶段产生的新的引用会被SATB的写屏障记录下来,并且还会定期更新和处理SATB局部缓存表的信息和记录,如果发现某一个Region中所有都是垃圾,那么就直接进行回收。
  • 重新标记:标记在并发期间因为程序运作而改变的引用对象
  • 清除:进行价值衡量,回收最优价值的Region区

2.拷贝存活对象
对年轻代进行100%回收,回收一部分老年代,如果只是Region中的一部分为垃圾,那么就分成8次进行回收,当然,你可以通过-XX:G1MixedGCCountTarget设置分步回收的次数。MixedGC默认是可以浪费10%的空间,如果垃圾占堆内存的比例小于10%,那么就不在进行回收了

回收过程如图
在这里插入图片描述
G1回收总结:开始的时候首先进行的是Young GC,然后等到老年代中的内存比例超过IHOP的时候开始进行着手准备收集老年代,首先进行并发标记周期,分析最有价值回收的区域,完成以后不会马上进行混合回收,而是等到下一次的Young GC的时候进行的STW会进行混合收集周期,然后再让线程继续运行,接下来进行的Young GC,然后会有老年代加入到收集区中,然后触发混合收集

举报

相关推荐

0 条评论