4

我不明白 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)]

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

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

3 回答 3

2

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

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

于 2011-04-30T05:45:15.267 回答
0

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

完全 GC 是什么意思?

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

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

是暂停是并行化的吗?

我认为它是并行的,但也是停止世界的。

使用哪种 GC 算法?

不清楚。

为什么G1决定使用它?

看上面。它离得太远了,堆里满是垃圾。

于 2011-03-08T08:39:09.050 回答
0

来自 oracle g1gc 博客technetwork 文章

完全 GC 是什么意思?

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

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

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

一般来说, Full GC会清理整个堆——包括年轻空间和永久空间(老一代)

另一方面,无论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文章)

使用哪种 GC 算法?

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

为什么G1决定使用它?

在响应第一个查询时进行了解释。

关于 G1GC 微调,请查看 oracle文章和相关SE 问题

于 2016-02-13T18:14:06.137 回答