G1 垃圾回收器 垃圾回收流程,是使用什么算法进行回收的,优劣势

G1垃圾回收器(Garbage-First)是Java HotSpot虚拟机中针对大内存和多核处理器设计的高效垃圾回收器,其核心思想是将堆划分为多个Region,并通过可控的停顿时间优化回收效率。以下是其详细的工作流程、算法及优劣势分析:

G1垃圾回收流程

初始标记(Initial Mark)(三色标记法 + SATB(初始快照))
STW阶段,标记从GC Roots直接可达的对象。
通常与Young GC同步触发,避免单独暂停。

了解一下快照:
SATB 全称:Snapshot-At-The-Beginning(初始快照)。
解决漏标:通过记录标记开始时的对象快照 + 写屏障捕获旧引用,完全解决了删除引用导致的漏标。
未完全解决:新增引用会导致浮动垃圾(多标),但这是设计上的权衡,不影响程序正确性。
适用场景:对低延迟敏感且堆内存较大的应用(如 G1 回收器),适合容忍少量浮动垃圾以换取更短的 STW 停顿。

并发标记(Concurrent Marking):
与应用线程并发执行,遍历堆中所有存活对象。
使用SATB(Snapshot-At-The-Beginning)算法处理并发标记期间的对象变化。

最终标记(Final Mark):
STW阶段,处理剩余的SATB日志,修正并发标记期间的变化。
确保标记结果准确。

筛选回收(Evacuation):
STW阶段,根据用户设定的停顿时间目标,选择回收价值高的Region(垃圾比例高)。
存活对象被复制到空闲Region(标记-复制算法),清空原Region。
可选择同时处理年轻代和老年代(Mixed GC)。

核心算法

分Region管理:
堆被划分为大小相等(1MB~32MB)的Region,逻辑分代(Eden/Survivor/Old/Humongous)。
大对象(Humongous)直接分配在特殊Region,避免内存碎片。

标记-复制与标记-整理结合:
年轻代回收(Young GC):存活对象从Eden/Survivor复制到新Region(标记-复制)。
混合回收(Mixed GC):选择性清理老年代Region,部分Region整理(减少碎片)。

SATB与三色标记法(cms只有三色标记法,会有漏标问题):
通过SATB快照辅助三色标记,解决并发标记解决漏标问题。
SATB(初始快照)机制
SATB是一种在垃圾回收并发标记阶段使用的技术,它的核心思想是在标记阶段开始时创建一个对象图的快照。在并发标记过程中,即使应用线程在继续运行并可能改变对象间的引用关系,SATB仍然能够确保不会漏标对象。
SATB可能会产生浮动垃圾。浮动垃圾是指在并发标记期间产生的新对象或者由于引用关系变化而未被及时回收的对象,但是相对于只用三色标记法产生漏标来说,浮动垃圾影响较小,个人认为该方案为削减方案

并发标记与SATB:
并发阶段通过SATB记录对象变化,保证标记一致性。
使用记忆集(Remembered Set)记录跨Region引用,加速回收过程。

优势
可控停顿时间:
用户可通过 -XX:MaxGCPauseMillis 设置预期停顿时间(默认200ms),G1动态调整回收Region数量。

高吞吐与低延迟平衡:
并发标记减少STW时间,Mixed GC增量回收老年代,避免Full GC。

高效内存管理:
Region设计灵活回收,优先处理高收益区域,避免全堆扫描。
适合大堆(4GB+),减少内存碎片风险。

适应性强:
自动调整分代大小,无需显式设置新生代/老年代比例。

劣势
内存开销:
记忆集(Remembered Set)和卡表维护占用额外内存(约堆的10%~20%)。

复杂调优:
参数敏感(如Region大小、停顿目标),调优难度高于CMS/Parallel GC。
潜在Full GC风险:
若回收速度跟不上对象分配速率,可能触发Serial Old的Full GC(长时间STW)。
处理大对象开销:
Humongous对象分配效率低,频繁分配可能影响GC效率。

适用场景

大堆应用:如64GB以上内存,需平衡吞吐与延迟。
实时系统:对停顿时间敏感的服务(如金融交易、在线游戏)。
替换CMS:在Java 9+中默认,适合需要稳定低延迟的场景。

总结

G1通过分Region、并发标记和增量回收策略,在可控停顿时间内高效管理内存。其优势在于灵活性和低延迟,但需权衡内存开销和调优复杂度。理解其机制有助于针对应用场景优化JVM参数,最大化性能表现。

G1相对CMS的优化

G1垃圾回收器相对于CMS做了诸多优化,这些优化使得G1在处理大堆内存、长时间运行的应用以及需要可预测停顿时间的应用场景中表现出色。以下是G1相对于CMS的主要优势:

‌内存管理更灵活‌:
G1通过将内存空间分成多个大小相等的区域(Region),每个区域可以是新生代或者老年代,这种灵活的内存管理方式使得G1能够更好地适应不同大小的应用内存需求。
Eden、Survivor、Old区在G1中不再固定,内存使用率上更加灵活,有助于减少内存碎片问题。

‌可预测的停顿时间‌:
G1允许通过设置预期停顿时间(Pause Time)来控制垃圾收集时间,从而避免了应用雪崩现象,提供了更为稳定的垃圾收集性能。
相比之下,CMS虽然也旨在减少停顿时间,但其停顿时间可能因堆内存大小和垃圾量而异,不够稳定。

‌高效的垃圾回收‌:
G1优先处理垃圾最多的区域,以最小化全局的停顿时间。
G1在回收内存后会马上同时做合并空闲内存的工作,而CMS默认是在STW(stop the world)的时候做,这进一步提高了G1的垃圾回收效率。

‌更好的内存利用率‌:
G1通过区域化管理和优先处理垃圾最多的区域,能够有效减少内存碎片,提高内存利用率。
相比之下,CMS使用标记-清除算法可能会导致内存碎片化,长期运行的应用可能会受到影响。
‌适用于大堆内存应用‌:

G1垃圾回收器更适合需要管理大堆内存的应用程序,能够提供较为稳定和可预测的垃圾收集性能。
而CMS在处理大堆内存时可能会因为内存碎片化和停顿时间不稳定而表现不佳。
‌并发和增量垃圾收集‌:

G1和CMS都支持并发和增量垃圾收集,能够与应用程序并发执行,尽量减少长时间的停顿。
但G1在并发和增量垃圾收集方面进行了更多优化,使得其性能更加出色。
综上所述,G1垃圾回收器相对于CMS在内存管理灵活性、可预测的停顿时间、高效的垃圾回收、更好的内存利用率以及适用于大堆内存应用等方面表现出明显优势。这些优化使得G1成为服务端应用中备受推崇的垃圾回收器之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值