代码之家  ›  专栏  ›  技术社区  ›  dogbane

垃圾第一个垃圾收集器是如何工作的?

  •  39
  • dogbane  · 技术社区  · 14 年前

    有人能解释一下G1垃圾收集器是如何工作的吗?我还没有找到任何全面的,易于理解的描述。

    谢谢

    3 回复  |  直到 7 年前
        1
  •  39
  •   fernacolo    11 年前

    收集器将堆拆分为固定大小的区域,并跟踪这些区域中的活动数据。它保留了一组“记忆集”进出该区域的指针。当GC被认为是必要的时,它首先收集活动数据较少的区域(因此称为“垃圾优先”)。通常,这意味着只需一步就可以收集整个区域:如果指向某个区域的指针数为零,则不需要对该区域进行标记或扫描。

    对于每个区域,它跟踪描述收集它们需要多长时间的各种度量。您可以给它一个关于暂停时间的软实时约束,然后它尝试在该约束时间内收集尽可能多的垃圾。

    JavaOne谈到了g1,关于这个主题的文章很少:

        2
  •  28
  •   AleÅ¡    11 年前

    在这个新的JavaOne 2012会话中,g1也得到了很好的解释: g1垃圾收集器性能调优= [ youtu be=>a>],[ pdf ]。

    他们从介绍CMS和G1开始,并对它们进行比较,然后解释G1分析和调整。

    G1特性

    • 固定大小区域 -堆拆分为区域(1MB-32MB,~2000,由VM确定)。
    • eden、survivor和oldgen表示为一组逻辑区域。
    • 活动物体从一个区域到另一个区域

    一个典型的g1堆可能看起来像:

    以下是每个G1阶段的摘要:

    1。年轻收藏

    1.1 young phase-minor gc

    • 疏散 -停止世界平行次要GC,其中活动对象从年轻一代疏散到幸存者区域(tenuring)或Oldgen区域(promotion)。
    • accounting -size of eden/survivor space for the next young gc is determined based on stats from each region and based on the pause time target set by the app.g1估计下一次YoungGC需要多少时间。
    • 调整大小<-g1 can now easyly reduce/resistant regions.

    1.2 young/initial mark

    • gc young initial mark 是与young gc集合并行执行的oldgen集合的初始标记阶段。初始标记是一个并行的并行标记过程。

    2。老一代收藏

    2.1 初始标记 -参见1.2。

    2.2 gc remark

    • 一站式世界暂停,同时标记活动对象
    • accounting-对于每个区域,在备注期间,g1跟踪区域(每个区域中有多少个对象处于活动状态)的 Liviness->strong>,并引用到区域中( rememberd set->strong>)-这说明g1需要多长时间才能在此区域上进行收集。
    • 回收的空区域

    2.3。 gc pause(mixed)

    • 选择低生活度的地区,收集其中一些。因此,我们首先收集“垃圾”。
    • 这些区域的实际收集与下一个Young GC同时执行,因此对于OldGen的收集,存在 no separate pause 。因此,gc pause(mixed) is a mixed collection of younggen and a part of old gen.。
    • 在gc pause(mixed)结束时,可能会有一些垃圾留在旧的gen区域中,这将在以后收集,具体取决于未来的生命力、暂停时间目标和未使用区域的数量。

    3。完全GC/< H2>

    请注意,g1旨在尽可能避免完全gc。至于Java7U40,G1中的PultGC停顿没有优化,并被实现为单线程操作。使用g1时,尽量避免使用完全gc—如果看到任何完全gc暂停,则gc设置可能需要进行一些调整。

    资源

    RBAGE收集器性能调整 [ youtube ] PDF ]

    他们从介绍CMS和G1开始,并对它们进行比较,然后解释G1分析和调整。

    G1特性

    • 固定大小区域 -堆划分为区域(1MB-32MB,~2000,由VM确定)。
    • 伊甸园,幸存者和老一辈代表 区域的逻辑集 .
    • 活动对象是 疏散 从一个地区到另一个地区

    典型的g1堆可能看起来像:

    A typical G1 heap may look like:

    以下是每个G1阶段的摘要:

    1。年轻收藏

    一点一 年轻阶段-轻微GC

    • 疏散 -停止世界平行的小GC,在那里活的物体从年轻一代疏散到幸存者区域(Tenning)或OldGen区域(Promotion)。
    • 会计核算 -下一个年轻GC的伊甸园/幸存者空间大小是根据每个区域的统计数据和应用程序设置的暂停时间目标确定的。G1估计下一次YoungGC需要多少时间。
    • 调整大小 -g1现在可以轻松地减少/调整伊甸园/幸存者区域的大小。

    一点二 年轻/初始标记

    • GC扬首字母标记 是与YoungGC集合并行执行的OldGen集合的初始标记阶段。初始标记是一个并行的并行标记过程。

    2。老一代收藏

    二点一 初始马克 见1.2。

    二点二 气相色谱注释

    • 一站式世界暂停,同时标记活动对象
    • 会计-在备注期间,每个区域的g1都在跟踪 活泼 区域(每个区域中有多少个对象)和区域中的引用( 记忆集 )-这告诉g1在该区域上进行收集需要多长时间。
    • 已回收空区域

    2.3。 GC暂停(混合)

    • 选择低的区域 活泼 收集一些。因此,我们首先收集“垃圾”。
    • 这些区域的实际收集与下一个年轻GC同时执行,因此 没有单独的暂停 为了收集旧款。因此, GC暂停(混合) 是年轻一代和老一代的混合收藏。
    • 在GC暂停(混合)结束时,可能会有一些垃圾留在旧的gen区域中,这些垃圾将在以后收集,这取决于未来的生命力、暂停时间目标和未使用区域的数量。

    三。完整收集

    请注意,g1旨在尽可能避免完全gc。至于Java7U40,G1中的PultGC停顿没有优化,并被实现为单线程操作。使用g1时,尽量避免使用完全gc—如果看到任何完全gc暂停,则gc设置可能需要进行一些调整。

    资源

        3
  •  0
  •   Sina Madani    7 年前

    我发现 Oracle's page 在这一点上非常有助于以一种易于理解的方式解释概念,而不是太冗长。