G1垃圾收集器

G1概述

较旧的垃圾收集器(串行,并行,CMS)将堆分成三个部分:固定内存大小的年轻代,旧代和永久代。

 

所有内存对象最终都属于这三个部分之一:

  1. 年轻代
  2. 年老代
  3. 永久带

G1收集器采用了不同的方法。

  堆被划分为一组大小相等的堆区域,每个堆区域都包含一个连续范围的虚拟内存。某些区域集被分配了与较旧的收集者相同的角色(eden,幸存者,旧角色),但是它们的大小并没有固定。这在内存使用方面提供了更大的灵活性。

 

执行垃圾收集时,G1以类似于CMS收集器的方式运行。G1执行并发全局标记阶段,以确定整个堆中对象的活动性。标记阶段完成后,G1知道哪些区域大部分为空。它首先收集在这些区域中,通常会产生大量的自由空间。这就是为什么这种垃圾收集方法称为“垃圾优先”的原因。顾名思义,G1将其收集和压缩活动集中在可能充满可回收对象(即垃圾)的堆区域中。G1使用暂停预测模型来满足用户定义的暂停时间目标,并根据指定的暂停时间目标选择要收集的区域数。

由G1标识为可回收的成熟区域是使用疏散收集的垃圾。G1将对象从堆的一个或多个区域复制到堆上的单个区域,并且在此过程中,压缩和释放了内存。撤离是在多处理器上并行执行的,以减少暂停时间并增加吞吐量。因此,对于每个垃圾收集,G1都在用户定义的暂停时间内连续工作以减少碎片。这超出了前面两种方法的能力。CMS(并发标记扫描)垃圾收集器不会进行压缩。ParallelOld垃圾收集仅执行整个堆压缩,这导致相当长的暂停时间。

重要的是要注意,G1不是实时收集器。它很有可能达到设定的暂停时间目标,但不是绝对确定的。G1根据先前收集的数据,估算在用户指定的目标时间内可以收集多少个区域。因此,收集器具有收集区域成本的合理准确的模型,并且收集器使用此模型来确定要收集哪些区域和多少区域,同时保持在暂停时间目标之内。

注意: G1同时具有并发(与应用程序线程一起运行,例如,优化,标记,清理)和并行(多线程,例如,停止世界)阶段。完整的垃圾回收仍然是单线程的,但是如果正确调整,您的应用程序应避免使用完整的GC。

G1足迹

如果从ParallelOldGC或CMS收集器迁移到G1,则可能会看到较大的JVM进程大小。这在很大程度上与“记账”数据结构有关,例如“记住的集”和“集合集”。

记忆集或RSets将对象引用跟踪到给定区域中。堆中每个区域有一个RSet。RSet可以并行和独立地收集区域。RSets的总体足迹影响不到5%。

集合集或CSet将在GC中收集的区域集。GC期间,将撤消(复制/移动)CSet中的所有实时数据。区域集可以是伊甸园,幸存者和/或老一辈。CSets对JVM的大小影响不到1%。

G1的推荐用例

G1的首要重点是为运行需要大型堆且GC延迟有限的应用程序的用户提供解决方案。这意味着堆大小约为6GB或更大,并且稳定且可预测的暂停时间低于0.5秒。

如果当前具有CMS或ParallelOldGC垃圾收集器的应用程序具有以下一个或多个特征,则将其切换到G1将非常有益。

注意:如果您使用的是CMS或ParallelOldGC,并且您的应用程序未经历长时间的垃圾收集暂停,则可以继续使用当前的收集器。使用最新的JDK不需要更改为G1收集器。

  1. 完整的GC持续时间太长或太频繁。
  2. 对象分配率或提升率差异很大。
  3. 不必要的长时间垃圾收集或压缩暂停(长于0.5到1秒)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值