【问题标题】:G1GC compaction within regions区域内的 G1GC 压缩
【发布时间】:2020-03-26 13:16:06
【问题描述】:

据我了解,G1 GC 执行疏散以从年轻和旧区域回收堆,这样做会间接压缩堆(将活动对象从要收集的区域复制到空区域)。 G1 GC 是否会遇到没有完全空的区域可供复制对象但在半满区域中有足够的碎片堆的情况?我想问一下,G1 是否会跟踪区域内的空闲空间,是否会在区域内进行压缩?

【问题讨论】:

    标签: java g1gc


    【解决方案1】:

    G1(垃圾收集器)什么时候开始运行,它首先在哪个内存区域收集?

    堆被划分为很多等价的估计堆区域,每个区域都是虚拟内存的触及范围。某些地区集被分配了类似的工作(伊甸园、幸存者、旧)

    G1 会在全球范围内同步进行冲压阶段,以决定整个堆中物品的活跃度。印记阶段结束后,G1 知道哪些区域大部分未填充。它首先聚集在这些区域,这通常会产生大量的可用空间。这就是这种垃圾分类策略被称为垃圾优先的原因。顾名思义,G1 将其分类和压实运动集中在堆栈中可能会装载可回收物品(即垃圾)的区域。 G1 利用中断预测模型来满足客户特征的停止时间目标,并根据预定的休息时间目标选择要收集的区域数量。

    G1 区分为准备好恢复的语言环境是使用清除收集的垃圾。 G1 将对象从商店的至少一个区域复制到堆栈上的一个单独的区域,并在此过程中两个压缩并打开内存。这种偏离在多处理器上并行执行,以减少停止时间并增加吞吐量。以这种方式,对于每个垃圾分类,G1 始终尝试减少断裂,在客户特征的延迟时间内工作。这是过去两种技术都无法做到的。

    基本上,跟踪每个区域的实时数据量,以及何时 触发收集,G1GC 将清除最多的收集 先说“垃圾”。

    这意味着它也可以从半满区域收集垃圾。

    【讨论】:

      【解决方案2】:

      HotSpot VM Garbage Collection Tuning GuideAllocation (Evacuation) Failure 部分中说:

      如果在疏散正在回收的区域期间找不到空闲(空)区域,则会发生分配失败(因为没有空间可以从正在疏散的区域中分配活动对象)并停止-world (STW) 完整收集已完成。

      这意味着,尽管没有明确说明,STW 完整集合能够执行压缩,否则,它不能解决碎片问题。我只在关于Humongous Objects and Humongous Allocations 的部分中找到了关于压缩功能的间接提示:

      为了减少复制开销,巨大的对象不包括在任何撤离暂停中。一个完整的垃圾回收周期将巨大的对象压缩到位。

      这并不意味着“G1 会跟踪区域内的可用空间”,因为这会破坏默认执行复制的目的,而是可能会在完整收集过程中获取这些必要信息,作为过程。

      【讨论】:

      • 最近让我震惊的是,在网上可以找到多少关于这些有趣话题的信息。在G1 源代码中的两天后,我几乎确信您是正确的。尽管每个 GC 循环都非常清楚某个区域的活跃度和大小,但理论上这是可能的。
      • @Eugene 通常情况下,选择垃圾最多的区域所需的区域垃圾比率的一般信息与仍然可达的差距的详细信息之间存在差异区域内的对象。复制收集器不需要后者,这是复制收集器的优点之一。因此,避免尽可能长时间地维护这些信息是直截了当的。
      • 你是对的,我理解,G1ReservePercent 的存在甚至暗示了这一点......
      猜你喜欢
      • 2012-04-26
      • 2017-04-02
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多