G1GC长暂停,带有初始标记

时间:2012-12-27 07:57:37

标签: java garbage-collection heap-memory g1gc

使用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]

2 个答案:

答案 0 :(得分:2)

进行日志记录,使用-XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime更好地了解问题和瓶颈

建议在G1GC 中使用-XX:+UnlockExperimentalVMOptions -XX:+AggressiveOpts -XX:+DoEscapeAnalysis -XX:+UseCompressedOops选项(如果本机/服务器和JDK版本支持这些选项)

另请使用-XX:GCPauseIntervalMillis=VALUE-XX:MaxGCPauseMillis=VALUE 的组合(它会控制您的停顿,通过做一些R&amp; D更好地获得两个参数的最佳拟合值)< / em> BTW我们成功使用值组合作为-XX:MaxGCPauseMillis = 400 -XX:GCPauseIntervalMillis = 8000

-XX:NewRatio param的默认值为40,因此最好将其设为40或40以上-XX:NewRatio=50

答案 1 :(得分:0)

G1 GC是一个自适应垃圾收集器,其默认设置使其无需修改即可高效工作。有关详细信息,请参阅以下问题。

Java 7 (JDK 7) garbage collection and documentation on G1

如果您遵循oracle建议的上述建议:

  1. 删除以下参数

    -XX:SurvivorRatio=10 
    
  2. MaxGCPauseMillis=40相比,
  3. default value of 200 ms过于激进。有一个合理的暂停时间目标。

  4. 根据您的服务器中的CPU核心数量,根据建议更改 - XX:ParallelGCThreads=14 -XX:ConcGCThreads=4