G1 GC是面向服务端应用程序的垃圾回收器,通过新的堆设计和停顿预测模型,可以到达用户指定的一个比较合理的软实时目标。本章将详细分析G1 GC的设计和实现。
G1 GC简介
=======
基于Region的堆
G1 GC全称是Garbage-First Garbage Collector,即垃圾优先的垃圾回收器,可以使用-XX:+UseG1GC开启。G1 GC(以下简称G1)抛弃了既有堆模型,它将整个堆划分为一些大小固定的内存块(Region),通过-XX:G1HeapRegionSize=控制Region大小(注意每个Region的大小只能是1MB、2MB、4MB、8MB、16MB和32MB),如图11-1所示。
图11-1 基于Region的堆划分
G1没有抛弃弱分代假说,在图11-1中,每个Region仍然包含代纪类型,一个特别的类型是巨型Region(Humongous Region),如果用户分配的对象超过了单个Region的大小,那么将使用连续多个Region存放对象,并将这些Region都标记为巨型Region。除了图11-1中包含的五种Region类型外,G1还有一个Archive类型的Region,它包含的是不可变的数据,该类型用于支持AppCDS。有了基于Region的堆划分就会相应需要基于Region的垃圾回收策略,G1包含YGC、FGC和Mixed GC,不同的垃圾回收策略将清理不同类型的Region。
记忆集RSet
G1包含YGC、FGC和Mixed GC三种垃圾回收策略,其中,YGC和FGC与其他垃圾回收器类似:YGC只回收新生代Region,而FGC回收整个堆。独有的Mixed GC是一种Partial GC策略,它会回收所有新生代Region和部分老年代Region。
既然Mixed GC属于Partial GC,那么它也会面临跨代引用问题,因为它回收整个新生代和部分老年代Region,所以一个老年代Region的根集包括GC Root和从老年代Region指向老年代Region的引用(old->old),新生代Region根集包括GC Root和老年代Region指向新生代Region的引用(old->young)。
G1使用RSet记忆集记录这些跨代引用。在记忆集设计中一般包含两种方式:一种是points-into记忆集,它表示“哪些对象引用了我”;另一种是points-out记忆集,它记录的是“我引用了哪些对象”。G1同时使用两种方式,如图11-2所示。
图11-2 G1 RSet
假设有a.field = b,如果使用points-into记忆集,那么b拥有记忆集,它记录a的位置。如果使用points-out记忆集,那么a拥有记忆集,它记录b的位置。G1的记忆集RSet同时使用两种设计,首先使用points-into结构来记忆有哪些其他Region引用自身(即对象b所在Region记录引用自身的对象a所在Region),然后每个Region包含一个points-out的卡表结构,记录指向当前对象的对象的具体位置(即对象b所在Region的卡表的索引)。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
*你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-X1MRGWQy-1710755790286)]