Jvm G1垃圾有一个慢工

Jvm G1垃圾有一个慢工,jvm,garbage,g1gc,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:

我在试图减少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, 
2013-06-03T17:24:51.606+0200:605364.503:[GC暂停(混合)
所需幸存者大小109051904字节,新阈值1(最大值1)
-年龄1:47105856字节,总计47105856
,0.47251300秒]
[并行时间:458.8毫秒]
[GC工作人员启动(ms):605364503.9 605364503.9 605364503.9 605364503.9 605364503.9 605364504.0
平均值:605364503.9,最小值:605364503.9,最大值:605364504.0,差值:0.1]
-->[**外部根扫描(ms)**:**356.4**3.1 3.7 3.6 3.2 3.0

平均值:62.2,**最小值:3.0,最大值:356.4,差异:353.4**][我宁愿将此作为评论发布,但我仍然缺乏必要的要点]

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

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]
关于这个问题我一直找不到太多的东西,但在这里

基本上,正如您猜测的那样,GC工作线程被阻塞了 当处理单个根时。我也看到过类似的问题 通过填充代码缓存(保存JIT编译方法的地方)。 代码缓存被视为单个根,因此在其 由单个GC工作线程完成。当代码缓存填满时, 声称要扫描代码缓存的线程开始被阻塞

一个完整的GC会清除这个问题,因为G1目前就是这样做的 类卸载:完整的GC卸载一大堆类 任何已卸载类的方法的编译代码 被nmethod清扫者释放。所以在一个完整的GC之后 代码缓存中的编译方法更少

它也可能仅仅是加载的类的数量 系统字典也被视为单个可请求根

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

问候