G1(Garbage First收集器)

G1收集器是JDK9默认的服务端垃圾收集器,采用Region内存布局,以停顿时间模型为目标,追踪垃圾堆积价值并优先回收。它不再坚持分代,而是灵活分配内存区域,特别处理大对象,并通过SATB算法进行并发标记。在内存回收速度跟不上分配速度时,可能触发FullGC。G1通过多阶段回收,确保在限定时间内高效完成垃圾收集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Garbage First收集器

        1.面向局部收集设计思路和基于Region内存布局形式。

        2.JDK 9成为服务端模式下的默认垃圾收集器,

        3建立起停顿时间模的收集器(消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标)

        4G1不再坚持分代区域划分,而是把Java堆大小相等独立区域,每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。

        5.Region中还有一类特殊的Humongous区域,专门用来存储大对象(超级大对象将会被存放在N个连续的Humongous Region之中)

        6.将Region作为单次回收的最小单元,每次回收到是Region大小的整数倍,有计划地避免在整个Java堆中进行全区域的垃圾收集

        7.G1收集器跟踪各个Region里面的垃圾堆积的价值大小,”维护一个优先级列表,每次根据用户设定允许的收集停顿时间(使用参数-XX:MaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region。

这种使用Region划分内存空间,以及具有优先级的区域回收方式,保证了G1收集器在有限的时间内获取尽可能高的收集效率。

        8.每个Region都维护有自己的记忆集,记忆集会记录下别的Region指向自己的指针,并标记这些指针分别在哪些卡页的范围之内。

        9.G1至少要耗费大约相当于Java堆容量10%至20%的额外内存来维持收集器工作。

        10.G1收集器则是通过原始快照(SATB)算法来实现的

        11.G1收集器默认在两个TAMS的指针这个地址以上的对象是被隐式标记过的,即默认它们是存活的,不纳入回收范围。

        12.内存回收的速度赶不上内存分配的速度,G1收集器也要被迫冻结用户线程执行,导致Full GC

        13衰减均值:,Region的统计状态越新越能决定其回收的价值。

         14 步骤:

                初始标记:标记一下GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新对象。借用进行Minor GC的时候同步完成的,无停顿。

                · 并发标记(Concurrent Marking):从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重新处理SATB记录下的在并发时有引用变动的对象。

                · 最终标记(Final Marking):对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。

                ·筛选回收(Live Data Counting and Evacuation):负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值