【问题标题】:G1GC GC logs what do they mean?G1GC GC日志是什么意思?
【发布时间】:2011-03-08 08:11:57
【问题描述】:

我不明白 G1GC GC 日志的确切含义(添加 PrintGCDetails 和 PrintGCTimeStamps 时)。有人能解释一下语法吗?

[

GC pause (young), 0.03067078 secs]
   [SATB Drain Time:   0.2 ms]
   [Parallel Time:  22.6 ms]
      [GC Worker Start Time (ms):  165213430.0  165213430.0  165213430.0  165213430.0  165213430.0  165213430.0  165213430.1  165213430.1]
      [Update RS (ms):  10.7  10.0  11.1  9.9  9.9  11.2  10.6  8.6
       Avg:  10.3, Min:   8.6, Max:  11.2]
         [Processed Buffers : 14 8 8 12 9 11 10 8
          Sum: 80, Avg: 10, Min: 8, Max: 14]
      [Ext Root Scanning (ms):  2.5  2.6  2.9  3.4  3.3  2.7  2.6  2.4
       Avg:   2.8, Min:   2.4, Max:   3.4]
      [Mark Stack Scanning (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2.2
       Avg:   0.3, Min:   0.0, Max:   2.2]
      [Scan RS (ms):  4.0  4.1  3.1  3.7  3.9  3.2  3.8  3.9
       Avg:   3.7, Min:   3.1, Max:   4.1]
      [Object Copy (ms):  4.7  5.3  4.7  4.8  4.7  4.7  4.8  4.7
       Avg:   4.8, Min:   4.7, Max:   5.3]
      [Termination (ms):  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
       Avg:   0.0, Min:   0.0, Max:   0.0]
         [Termination Attempts : 23 1 26 23 19 29 22 25
          Sum: 168, Avg: 21, Min: 1, Max: 29]
      [GC Worker End Time (ms):  165213452.3  165213452.3  165213452.3  165213452.3  165213452.3  165213452.3  165213452.3  165213452.3]
      [Other:   0.7 ms]
   [Clear CT:   0.6 ms]
   [Other:   7.3 ms]
      [Choose CSet:   0.0 ms]
   [ 3329M->3245M(6000M)]

那么full GC是什么意思呢?是暂停是并行化的吗?使用哪种 GC 算法?为什么 G1 决定使用它?

5.941: [Full GC 7891K->4756K(6000M), 0.1939233 secs]

【问题讨论】:

    标签: java logging garbage-collection heap-memory g1gc


    【解决方案1】:

    很少有关于“它是并行化的暂停吗?”的信息。 用 Java 的话来说, GC 有两种类型(基于与 mutator 的并发,即应用程序) - (1)Stop-the-world (2)Concurrent

    Stop-the-world GC 进一步细分为 - 1a) 如果 GC 线程数为 1,则 Stop-the-world 1b) 如果 GC 线程数多于一个,则为并行

    【讨论】:

      【解决方案2】:

      以下内容来自我可以在 G1 GC 上在线找到的(相当有限的)材料的字里行间阅读。 (付费墙后面有 2004 年的论文、JavaWorld 2008 的幻灯片和 G1 GC page。如果有人有其他链接,请添加。)

      Full GC 是什么意思?

      与其他 HotSpot GC 一样,堆被划分为 New 或 Eden 空间、Survivor 空间和 Old 或 Tenured Object 空间。但是,与其他 HotSpot GC 不同,G1 使用多个区域来保存空间。

      通常,G1 收集器以增量方式与应用程序线程并行运行,跟踪对象并将其“疏散”到其他区域。然而,似乎收集器有时会远远落后,以至于它必须停止一切,并使用所有可用的处理器来收集所有堆区域。我认为这是一个完整的 GC。

      它是并行化的暂停吗?

      我认为它是并行化的,但也是stop-the-world。

      使用哪种 GC 算法?

      不清楚。

      为什么 G1 决定使用它?

      见上文。它落后得太远了,堆里满是垃圾。

      【讨论】:

      • 对不起?如果您有更多相关链接,请添加。
      • 谢谢斯蒂芬。我熟悉这些链接。问题是网络上公开的信息似乎不足......这是否意味着没有人使用或真正评估过这个?
      • 我无法判断。我敢肯定,有些人使用它,但有多少是无法确定的。 有 6 页关于“g1gc 调整”的 Google 点击,但我不希望它们中的任何一个提供明确的信息......除非它们来自 Oracle。
      【解决方案3】:

      来自 oracle g1gc blogtechnetwork article

      Full GC 是什么意思?

      对于 G1GC,任何超过一半区域大小的对象都被视为“巨大的对象”。这样的对象直接在老年代分配到“Humongous regions”中。 These Humongous regions are a contiguous set of regions.

      Dead Humongous objects are freed 在清理阶段的标记周期结束时以及在完整的垃圾回收周期中。

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

      Full GC 通常会清理整个堆 - Young 和 Tenured 空间(老一代)

      另一方面,无论 GC 类型如何,您都必须担心“应用程序线程停止”的时间:年轻 GC 或 Full GC 等。

      它是并行化的暂停吗?

      YounGC is parallelized but not FullGC

      Full GCs: Currently G1 full gc is single threaded and very slow,我们应该尽量避免full gcs(来自oracle文章) p>

      使用哪种 GC 算法?

      你的意思是 Young GC/Major GC/Full GC?根据您的日志,最后一行是 Full GC,第一行是 YoungGC。

      为什么 G1 决定使用它?

      在第一次查询时进行了解释。

      关于 G1GC 微调,看看 oracle article 和相关的SE question

      【讨论】: