java - JVM CMS 垃圾收集问题

标签 java jvm garbage-collection concurrent-mark-sweep

我在使用并发标记-清除收集器的应用程序 GC 日志文件中看到以下症状:

4031.248: [CMS-concurrent-preclean-start]
4031.250: [CMS-concurrent-preclean: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
4031.250: [CMS-concurrent-abortable-preclean-start]
 CMS: abort preclean due to time 4036.346: [CMS-concurrent-abortable-preclean: 0.159/5.096 secs] [Times: user=0.00 sys=0.01, real=5.09 secs] 
4036.346: [GC[YG occupancy: 55964 K (118016 K)]4036.347: [Rescan (parallel) , 0.0641200 secs]4036.411: [weak refs processing, 0.0001300 secs]4036.411: [class unloading, 0.0041590 secs]4036.415: [scrub symbol & string tables, 0.0053220 secs] [1 CMS-remark: 16015K(393216K)] 71979K(511232K), 0.0746640 secs] [Times: user=0.08 sys=0.00, real=0.08 secs] 

preclean 进程不断中止。我尝试将 CMSMaxAbortablePrecleanTime 从默认值 5 秒调整为 15 秒,但这没有帮助。当前的 JVM 选项如下...

Djava.awt.headless=true
 -Xms512m
 -Xmx512m
 -Xmn128m
 -XX:MaxPermSize=128m
 -XX:+HeapDumpOnOutOfMemoryError
 -XX:+UseParNewGC
 -XX:+UseConcMarkSweepGC
 -XX:BiasedLockingStartupDelay=0
 -XX:+DoEscapeAnalysis
 -XX:+UseBiasedLocking
 -XX:+EliminateLocks
 -XX:+CMSParallelRemarkEnabled
 -verbose:gc
 -XX:+PrintGCTimeStamps
 -XX:+PrintGCDetails
 -XX:+PrintHeapAtGC
 -Xloggc:gc.log
 -XX:+CMSClassUnloadingEnabled
 -XX:+CMSPermGenPrecleaningEnabled
 -XX:CMSInitiatingOccupancyFraction=50
 -XX:ReservedCodeCacheSize=64m
 -Dnetworkaddress.cache.ttl=30
 -Xss128k

似乎 concurrent-abortable-preclean 永远没有机会运行。我通读了 https://blogs.oracle.com/jonthecollector/entry/did_you_know其中有启用 CMSScavengeBeforeRemark 的建议,但暂停的副作用似乎并不理想。谁能提供任何建议?

另外我想知道是否有人有很好的引用资料来查找 CMS GC 日志,尤其是这一行:

[1 CMS-remark: 16015K(393216K)] 71979K(511232K), 0.0746640 secs]

不清楚这些数字指的是什么内存区域。 编辑 找到了这个 http://www.sun.com/bigadmin/content/submitted/cms_gc_logs.jsp 的链接

最佳答案

[Times: user=0.00 sys=0.01, real=5.09 secs]

我会尝试调查为什么 CMS-concurrent-abortable-preclean-start 在 5 秒内既没有获得用户也没有获得系统 CPU 时间。

我的建议是从一个“干净”的 JVM CMS 启动标志开始

-Djava.awt.headless=true
-Xms512m
-Xmx512m
-Xmn128m
-Xss128k
-XX:MaxPermSize=128m
-XX:+UseConcMarkSweepGC
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:gc.log
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintHeapAtGC

然后检查问题是否重现并继续一次调整一个参数。

关于java - JVM CMS 垃圾收集问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2906676/

相关文章:

java - 如何使用accumulate进行多次运算和集合

java - 如何使用java在cloudant上查询搜索索引?

java - 我们如何查看JVM过去的内存和CPU使用记录

java - 无法运行 Eclipse; JVM 终止,退出代码 = 13

c# - 什么是 GC 漏洞?

java - "finalizer guardian"在 Java 中如何工作?

java - Young , Tenured 和 Perm 一代

java - 非测试设置中的 Wiremock

java - 如何计算从 1 到 X 的整数之和是否为素数

java - JVM 加载库类后会做什么?