我的服务器在 CentOS 6.7 上使用 1.8.0_92,GC 参数是 '-Xms16g -Xmx16g -XX:+UseG1GC'。所以默认的 InitiatingHeapOccupancyPercent 是 45,G1HeapWastePercent 是 5,G1MixedGCLiveThresholdPercent 是 85。我的服务器的混合 GC 从 7.2GB 开始,但是它清理的越来越少,最后老一代保持大于 7.2GB,所以它总是尝试做并发标记。最后,所有堆都用尽了,发生了完整的 GC。完全 GC 后,使用的 old gen 小于 500MB。
我很好奇为什么我的混合 GC 不能收集更多,看起来实时数据没有那么多......
我试过打印 g1 相关信息,发现很多类似下面的消息,看起来我的老一代包含很多实时数据,但是为什么 full GC 可以收集这么多......
G1Ergonomics (Mixed GCs) do not continue mixed GCs, reason: reclaimable percentage not over threshold, candidate old regions: 190 regions, reclaimable: 856223240 bytes (4.98 %), threshold: 5.00 %
下面的日志是修改 InitiatingHeapOccupancyPercent 为 15(在 2.4GB 开始并发标记)以加快速度的结果。
### PHASE Post-Marking
......
### SUMMARY capacity: 16384.00 MB used: 2918.42 MB / 17.81 % prev-live: 2407.92 MB / 14.70 % next-live: 2395.00 MB / 14.62 % remset: 56.66 MB code-roots: 0.91 MB
### PHASE Post-Sorting
....
### SUMMARY capacity: 1624.00 MB used: 1624.00 MB / 100.00 % prev-live: 1123.70 MB / 69.19 % next-live: 0.00 MB / 0.00 % remset: 35.90 MB code-roots: 0.89 MB
编辑:
我尝试在混合 GC 之后触发 full GC,它仍然可以减少到 4xx MB,所以看起来我的老一代有更多的数据可以收集。
在full gc之前,混合的gc日志是
32654.979: [G1Ergonomics (Mixed GCs) start mixed GCs, reason: candidate old regions available, candidate old regions: 457 regions, reclaimable: 2956666176 bytes (17.21 %), threshold: 5.00 %], 0.1106810 secs]
....
[Eden: 6680.0M(6680.0M)->0.0B(536.0M) Survivors: 344.0M->280.0M Heap: 14.0G(16.0G)->7606.6M(16.0G)]
[Times: user=2.31 sys=0.01, real=0.11 secs]
...
[GC pause (G1 Evacuation Pause) (mixed)
...
32656.876: [G1Ergonomics (CSet Construction) finish adding old regions to CSet, reason: old CSet region num reached max, old: 205 regions, max: 205 regions]
32656.876: [G1Ergonomics (CSet Construction) finish choosing CSet, eden: 67 regions, survivors: 35 regions, old: 205 regions, predicted pause time: 173.84 ms, target pause time: 200.00 ms]
32656.992: [G1Ergonomics (Mixed GCs) continue mixed GCs, reason: candidate old regions available, candidate old regions: 252 regions, reclaimable: 1321193600 bytes (7.69 %), threshold: 5.00 %]
[Eden: 536.0M(536.0M)->0.0B(720.0M) Survivors: 280.0M->96.0M Heap: 8142.6M(16.0G)->6029.9M(16.0G)]
[Times: user=2.49 sys=0.01, real=0.12 secs]
...
[GC pause (G1 Evacuation Pause) (mixed)
...
32659.727: [G1Ergonomics (CSet Construction) finish adding old regions to CSet, reason: reclaimable percentage not over threshold, old: 66 regions, max: 205 regions, reclaimable: 857822432 bytes (4.99 %), threshold: 5.00 %]
32659.727: [G1Ergonomics (CSet Construction) finish choosing CSet, eden: 90 regions, survivors: 12 regions, old: 66 regions, predicted pause time: 120.51 ms, target pause time: 200.00 ms]
32659.785: [G1Ergonomics (Mixed GCs) do not continue mixed GCs, reason: reclaimable percentage not over threshold, candidate old regions: 186 regions, reclaimable: 857822432 bytes (4.99 %), threshold: 5.00 %]
[Eden: 720.0M(720.0M)->0.0B(9064.0M) Survivors: 96.0M->64.0M Heap: 6749.9M(16.0G)->5572.0M(16.0G)]
[Times: user=1.20 sys=0.00, real=0.06 secs]
编辑: 2016/12/11
我已经从另一台机器上用-Xmx4G
.
我使用 lettuce 作为我的 redis 客户端,它使用 LatencyUtils 具有跟踪功能。它使 LatencyStats(其中包含一些long[]
具有近 3000 个元素的元素)实例每 10 分钟弱引用一次(发布后重置延迟默认为 true,https://github.com/mp911de/lettuce/wiki/Command-Latency-Metrics)。所以在很长一段时间后它会对 LatencyStats 产生很多弱引用。
目前我不需要跟踪生菜,所以只需禁用它,它就不再有完整的 GC。但不确定为什么混合 gc 不能清除它们。