G1垃圾有一个慢工人

时间:2013-06-03 15:33:17

标签: jvm garbage g1gc

我遇到了GC暂停(~400ms)的问题,我正试图减少它。我注意到我总是有一个工人比其他工人慢很多:

2013-06-03T17:24:51.606+0200: 605364.503: [GC pause (mixed)
Desired survivor size 109051904 bytes, new threshold 1 (max 1)
- age   1:   47105856 bytes,   47105856 total
, 0.47251300 secs]
[Parallel Time: 458.8 ms]
  [GC Worker Start (ms):  605364503.9  605364503.9  605364503.9  605364503.9  605364503.9  605364504.0
   Avg: 605364503.9, Min: 605364503.9, Max: 605364504.0, Diff:   0.1]
-->  [**Ext Root Scanning (ms)**:  **356.4**  3.1  3.7  3.6  3.2  3.0
   Avg:  62.2, **Min:   3.0, Max: 356.4, Diff: 353.4**] <---
  [Update RS (ms):  0.0  22.4  33.6  21.8  22.3  22.3
   Avg:  20.4, Min:   0.0, 

正如你所看到的,当其他人只花了3毫秒时,一名工人需要356毫秒!

如果某人有想法或认为这是正常的......

1 个答案:

答案 0 :(得分:2)

[我宁愿将此作为评论发布,但我仍然缺乏必要的观点]

不知道这是否正常,但我遇到了同样的问题:

2014-01-16T13:52:56.433+0100: 59577.871: [GC pause (young), 2.55099911 secs]
   [Parallel Time: 2486.5 ms]
      [GC Worker Start (ms):  59577871.3  59577871.4  59577871.4  59577871.4  59577871.4  59577871.5  59577871.5  59577871.5
       Avg: 59577871.4, Min: 59577871.3, Max: 59577871.5, Diff:   0.2]
      [Ext Root Scanning (ms):  152.0  164.5  159.0  183.7  1807.0  117.4  113.8  138.2
       Avg: 354.5, Min: 113.8, Max: 1807.0, Diff: 1693.2]

我一直无法找到关于这个主题的内容,但是http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2013-February/001484.html

  

基本上,当你猜测一个GC工作线程被阻止时   处理单个根时。我见过类似的问题   通过填写代码缓存(保存JIT编译的方法)。   代码缓存被视为单个根,因此在其中声明   整个由一个GC工作者线程完成。当代码缓存填满时,   声称要扫描的代码缓存的线程开始被阻止。

     

完整的GC清除了问题,因为这是G1目前所处的位置   class unloading:完整的GC卸载了一大堆允许的类   任何卸载类的方法的任何编译代码   被nmethod清扫工释放。所以经过一个完整的GC之后的数量   代码缓存中的编译方法较少。

     

它也可能只是加载类的绝对数量   系统字典也被视为单一的可索引根。

我想我会尝试启用代码缓存刷新并让你知道。如果你终于设法解决了这个问题,请告诉我,我也在努力完成它。

亲切的问候