java - 理解 GC G1 - 并发标记阶段

标签 java garbage-collection jvm g1gc

我试图了解一些关于 GC G1 的事情,希望你们能帮助我。

  • GC G1 中整个 Concurrent Marking 阶段的作用到底是什么?我的意思是所有部分(初始标记、根区域扫描、...、清理)。

  • 据我了解,它的作用是标记从根区域可到达的所有 Activity 对象(在并发标记阶段是在“初始标记”部分选择的幸存者区域)并估计旧区域的 Activity 度(根据它们将被选择收集设置为混合疏散暂停)。我对吗?
  • 在混合疏散暂停期间,哪些对象在旧区域被标记为垃圾?

  • 如果我理解正确,混合疏散暂停标记并删除 GC 根和 memset 无法访问的对象。并发标记标记的是不同的对象集,因此这些对象可能会重叠,但它们不必重叠。我对吗?
  • GC 根到底是什么?它们对于新集合和混合集合是否相同(混合集合中 memset 合的引用除外)?
  • 我下面的总结正确吗?

  • 完全年轻的集合标记来自伊甸园和幸存者区域的所有 Activity 对象(这意味着 GC 根可到达),并将它们撤出(复制)到新的幸存者(或旧)区域。其余的对象被视为垃圾并被删除。自由区域被回收。

    开始时的并发标记阶段标记所有可能引用旧区域的幸存者区域(基于记住的集合?)。存活区域在这里被视为 GC 根,因为这部分发生在完全年轻的收集期间,因此我们确信其中的所有对象都存在。然后 GC 遍历对象图(从选定的幸存者区域的对象开始)并标记所有 Activity 对象。

    在混合疏散暂停中,根据活跃度统计(在前一阶段计算),选择一些旧区域进行收集。然后来自选定区域的所有 Activity 对象都被疏散(复制)到新区域( Activity 意味着:a. 在并发标记期间选择和 b. 在标准疏散暂停中 - 可以从 GC 根和记住的集合访问)。其余对象作为垃圾被删除,区域被回收。

    最佳答案

    1. What exactly is the role of whole Concurrent Marking phase in GC G1? I mean all parts (initial marking, root region scan, ..., cleanup).


    标记阶段的作用是从根开始,向下遍历到根的所有连接组件并对其进行标记。

    “并发”只是意味着这是在多个根上同时进行的。

    1. Which objects are marked as a garbage in old regions during mixed evacuation pause?


    没有任何。

    目标是仅标记 Activity 对象。任何未标记为 Activity 的东西,都会自动(正确地)假定为死亡。

    1. What exactly GC roots are? Are they the same for young and mixed collection (except references from remembered sets in mixed collection)?


    This article链接在此 another SO question列出了以下四种类型的 GC 根:
  • 局部变量;
  • Activity 线程;
  • 静态变量;和,
  • JNI 引用。

  • root 的定义与集合集无关。根是任何 GC 生成或集合中的根。

    1. Is my summary below correct?


    所有四个问题中最棘手的问题。请允许我跳过这一点。 :)

    关于java - 理解 GC G1 - 并发标记阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56004805/

    相关文章:

    java - 具有异常预期的 JUnit 测试(多个断言)

    java - Java 中的编译接口(interface)

    Java 集合<对象> 或集合<?>

    java - 如何从应用程序内部检测 JVM 垃圾收集周期?

    Java 垃圾收集和 null

    java - 自动删除旋转的 gc.log 文件

    java - 当不再需要时,JVM 是否会将空闲内存返还给操作系统?

    java - jmh GC 分析器结果的值

    java - 如何编写与源图像具有相同压缩设置的修改图像

    java - @Value 属性在 JUnit 测试中始终为 null