【问题标题】:G1GC long pause with initial-markG1GC 带初始标记的长时间停顿
【发布时间】:2012-12-12 15:29:15
【问题描述】:

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

【问题讨论】:

  • 对大多数参数使用默认值,除了暂停时间目标、并行 gc 线程等。G1gc 使用默认值时性能更好,如上所述。

标签: java garbage-collection heap-memory g1gc


【解决方案1】:

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

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

另外请使用-XX:GCPauseIntervalMillis=VALUE-XX:MaxGCPauseMillis=VALUE 的组合(它会控制你的停顿,最好通过一些研发来获得两个参数的最佳拟合值组合) 顺便说一句,我们成功地将值组合为 -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000

-XX:NewRatio 参数的默认值为 40,因此最好设置为 40 或大于 40,例如-XX:NewRatio=50

【讨论】:

【解决方案2】:

G1 GC 是一种自适应垃圾收集器,其默认设置使其无需修改即可高效工作。请参阅以下问题了解更多详情。

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

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

  1. 去掉下面的参数

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

  3. 根据建议更改 -XX:ParallelGCThreads=14 -XX:ConcGCThreads=4,具体取决于服务器中的 CPU 内核数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多