我遇到了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毫秒!
如果某人有想法或认为这是正常的......
答案 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之后的数量 代码缓存中的编译方法较少。
它也可能只是加载类的绝对数量 系统字典也被视为单一的可索引根。
我想我会尝试启用代码缓存刷新并让你知道。如果你终于设法解决了这个问题,请告诉我,我也在努力完成它。
亲切的问候