【Java 8 GC 调优】G1 调优

本文详细介绍了Java 8 G1垃圾收集器的工作原理和调优策略,包括Yong GC、混合GC的执行过程,以及如何设置暂停时长目标。G1通过分区和分代进行内存管理,采用并发和多阶段标记周期,以实现低暂停时间。在调优时应注意避免固定年轻代大小,合理设置暂停时长目标,并根据应用需求调整相关GC参数。
摘要由CSDN通过智能技术生成

此节介绍如何调整和优化G1,以进行评估、分析和性能测试。

如《G1》所述,G1 是一个 分区、分“代” 的收集器,这意味着Java对象堆被分成了许多大小相等的区域。JVM启动时会设置区域大小。区域大小取决于堆大小,从 1MB 到 32MB。目标是不超过 2048 个区域。Eden、Survivor 和 老年代 是逻辑集合,且不是连续的。

G1 有一个尝试达成的 暂停时长 目标(这是一个软实时目标)。在 Yong GC 期间,G1 会调整年轻代(Eden 和 Surviver 目标),以满足此软实时目标。可查看《G1》中的“暂停”和“暂停时长目标”了解G1为什么会暂停(业务线程)以及如何设置暂停时长目标。

在混合GC期间,G1会基于 混合GC的目标数量、堆中每个区域内存活对象的百分比、可接受的堆浪费总体百分比,来调整老年代区域数量。

G1 会将一个或多个区域(CSet, Collection Set)中的存活对象增量地并行复制到一个或多个不同的新区域,以较少堆碎片,实现“压缩”。此目标是为了回收尽可能多的堆空间。它会从那些包含最多可回收空间的区域开始,且尽量不超过暂停时长目标(G1)。

G1 使用独立的 Remembered Set(RSet)来跟踪区域内的引用。独立的 RSet 使得 并行和独立的GC 成为可能,因为对于指向区域内的引用,只需扫描该目标区域,而不是整个堆。G1 使用了一个 ”写后屏障“ 来记录堆的改变,并更新到 RSet(rememebered set)。

 

GC 暂停

除了 Yong GC 和 混合GC 中 STW(stop-the-world)的 “转移暂停”(《G1》中的“分配(转移)”失败),G1 还有 并行、并发 和 多个阶段的标记周期。G1 使用了 SATB(snapshot-at-the-beginning)算法。该算法会在标记周期开始时逻辑地获取堆中存活对象的快照。存活对象集也包括自标记周期开始以来分配的对象。G1 标记算法使用一个 “预写屏障” 来记录和标记 “逻辑快照” 中的对象。

 

Yong GC

G1 会满足大多数来自 Eden集合区 的分配请求。在 Yong GC 中,G1 会对前一次GC确定的 Eden 区 和 Survivor 区 进行垃圾收集。Eden 和 Survivor 区域中的存活对象会被 复制/转移 到新的区域中。对于一个特定的对象,其目的地区域取决于它的“年龄”;一个足够 “老” 的对象会被转移到老年代区域(即,被“提升”);否则,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值