环境详细信息:操作系统:Linux RedHat Java:JRE 6 Update 21
我正在为我的应用程序使用以下 GC 设置。
-server -d64 -Xms8192m -Xmx8192m -javaagent:lib/instrum.jar -XX\:MaxPermSize=256m -XX\:+UseParNewGC -X\:+ParallelRefProcEnabled -XX\:+UseConcMarkSweepGC -XX\:MaxGCPauseMillis=250 -XX\:+CMSIncrementalMode -XX\:+CMSIncrementalPacing -XX\:+CMSParallelRemarkEnabled -verbose\:gc -Xloggc\:/tmp/my-gc.log -XX\:DisableExplicitGC -XX\:+PrintGCTimeStamps -XX\:+PrintGCDetails -XX\:+UseCompressedOops
有了那里的设置,在应用程序开始时会有一个 Full GC
2.946: [Full GC 2.946: [CMS: 0K->7394K(8111744K), 0.1364080 secs] 38550K->7394K(8360960K), [CMS Perm : 21247K->21216K(21248K)], 0.1365530 secs] [Times: user=0.10 sys=0.04, real=0.14 secs]
随后是 4-5 次成功的 CMS 收集,但在此之后日志中没有 CMS 的痕迹,只有次要收集上有条目。
379022.293: [GC 379022.293: [ParNew: 228000K->4959K(249216K), 0.0152000 secs] 7067945K->6845720K(8360960K) icms_dc=0 , 0.0153940 secs]
堆不断增长,已达到 7GB。我们必须重新启动应用程序,因为我们无法承受 OOM 或生产系统中的任何故障。
我不明白为什么 CMS 收集器停止清理。欢迎任何线索/建议。提前致谢。
==================================================== =====================================1月23日更新。
感谢大家到现在为止的回复。我已经在测试环境中设置了应用程序并使用以下一组 JVM 选项测试了该应用程序:
选项1
-server -d64 -Xms8192m -Xmx8192m -javaagent\:instrum.jar -XX\:MaxPermSize\=256m -XX\:+UseParNewGC -XX\:+UseConcMarkSweepGC -verbose\:gc -Xloggc\:my-gc.log -XX\:+PrintGCTimeStamps -XX\:+PrintGCDetails
选项 #2
-server -d64 -Xms8192m -Xmx8192m -javaagent\:instrum.jar -XX\:MaxPermSize\=256m -XX\:+UseParNewGC -XX\:+UseConcMarkSweepGC -verbose\:gc -Xloggc\:my-gc.log -XX\:+DisableExplicitGC -XX\:+PrintGCTimeStamps -XX\:+PrintGCDetails
我用两种设置并行运行了 2 天的测试。这些是我的观察:
选项 #1 堆内存稳定,但有 90 个 ConcurrentMarkSweep 集合,JVM 花费了 24 分钟。那太高了。我在 GC 日志中看到以下几行,并且模式每隔一小时继续一次......
318995.941: [GC 318995.941: [ParNew: 230230K->8627K(249216K), 0.0107540 secs] 5687617K->5466913K(8360960K), 0.0109030 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
319050.363: [GC 319050.363: [ParNew: 230195K->9076K(249216K), 0.0118420 secs] 5688481K->5468316K(8360960K), 0.0120470 secs] [Times: user=0.12 sys=0.01, real=0.01 secs]
319134.118: [GC 319134.118: [ParNew: 230644K->8503K(249216K), 0.0105910 secs] 5689884K->5468704K(8360960K), 0.0107430 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
319159.250: [Full GC (System) 319159.250: [CMS: 5460200K->5412132K(8111744K), 19.1981050 secs] 5497326K->5412132K(8360960K), [CMS Perm : 72243K->72239K(120136K)], 19.1983210 secs] [Times: user=19.14 sys=0.06, real=19.19 secs]
我没有看到并发标记和扫描日志。这是否意味着 CMS 切换到吞吐量收集器?如果是,为什么?
选项#2:
由于我看到了 Full GC (System) 日志,所以我想到了添加 -XX\:+DisableExplicitGC。但是使用该选项不会发生收集,当前堆大小为 7.5G。我想知道为什么 CMS 正在执行 Full GC 而不是并发收集。