java - G1GC 带有初始标记的长停顿

标签 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]

最佳答案

对于日志记录,使用 -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/

相关文章:

java - Android通过Context从外部类调用方法

java - 即使堆使用量远低于限制,Tomcat OOM 错误

c# - 当对象超出 C# 范围时?

c# - 我如何在 C#.Net 中查看堆和堆栈中的对象

java - 如何优化Java堆中未使用的空间

java - 计算范围内的素数 RMI 版本与并发版本

java - Stack 不将项目插入集合中

java - 如何从Java代码中读取JNDI值?

java - 什么时候创建/销毁常量字符串?

c++ - 全局指针变量如何存储在内存中?