使用 j7u5,G1GC
"-Xms3200m -Xmx3200m -XX:+UseG1GC -XX:ParallelGCThreads=14 -XX:ConcGCThreads=4 -XX:MaxGCPauseMillis=40 -XX:NewRatio=2 -XX:SurvivorRatio=10 -XX:+ PrintGC -XX:+PrintGCDateStamps"
对于给定的性能测试,我的应用程序在按预期运行 5 小时后出现长时间暂停。除了这个大的(也是唯一的),还有一些小的初始标记阶段。
有什么建议可以弄清楚这个长时间停顿发生了什么,以及如何对其进行调整以避免这种影响延迟目标(百分位数 98%、99.999%)的长时间停顿?
2012-12-22T09:48:57.966+0000: [GC pause (young) 2436M->1460M(3200M), 0.0627090 secs]
2012-12-22T09:49:07.295+0000: [GC pause (young) 2458M->1481M(3200M), 0.0871760 secs]
2012-12-22T09:49:18.905+0000: [GC pause (young) 2479M->1503M(3200M), 0.0930280 secs]
2012-12-22T09:49:32.366+0000: [GC pause (young) 2501M->1524M(3200M), 0.0827900 secs]
2012-12-22T09:49:44.576+0000: [GC pause (young) (initial-mark) 2522M->1546M(3200M), 3.4979530 secs]
2012-12-22T09:49:48.074+0000: [GC concurrent-root-region-scan-start]
2012-12-22T09:49:48.079+0000: [GC concurrent-root-region-scan-end, 0.0056590]
2012-12-22T09:49:48.080+0000: [GC concurrent-mark-start]
2012-12-22T09:49:48.173+0000: [GC concurrent-mark-end, 0.0932560 sec]
2012-12-22T09:49:48.180+0000: [GC remark, 0.0470160 secs]
2012-12-22T09:49:48.232+0000: [GC cleanup 1585M->944M(3200M), 0.0180490 secs]
2012-12-22T09:49:48.251+0000: [GC concurrent-cleanup-start]
2012-12-22T09:49:48.255+0000: [GC concurrent-cleanup-end, 0.0047270]
最佳答案
对于日志记录,使用 -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime
以便更好地理解问题和瓶颈
推荐使用-XX:+UnlockExperimentalVMOptions -XX:+AggressiveOpts -XX:+DoEscapeAnalysis -XX:+UseCompressedOops
G1GC 的选项 (如果 native /服务器和 JDK 版本支持这些选项)
另请使用-XX:GCPauseIntervalMillis=VALUE
结合 -XX:MaxGCPauseMillis=VALUE
(它将控制您的停顿,通过一些研发更好地获得两个参数的最适合值的组合) 顺便说一句,我们成功地将值组合用作 -XX:MaxGCPauseMillis =400 -XX:GCPauseIntervalMillis=8000
默认值-XX:NewRatio
param 是 40,所以最好是 40 或大于 40,例如-XX:NewRatio=50
关于java - G1GC 带有初始标记的长停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14051323/