我遇到堆内存问题。日常内存增加100MB并继续增加,FULL GC在1.5GB的限制之后运行,但它仍然没有恢复。 检查日志后,看到CMS:abort preclean?这可能是因素。 任何帮助表示赞赏。
CMS:因时间而中止预洗?任何想法如何解决这个问题?Enviornment:Java 1.6
Here are my GC params:
-Dfile.encoding=UTF-8 \
-Duser.timezone=US/Eastern \
-Dsun.net.inetaddr.ttl=60 \
-Dsun.net.inetaddr.negative.ttl=60 \
-Xms1024m \
-Xmx1536m \
-Xss512k \
-verbose:gc \
-Xloggc:$CATALINA_BASE/logs/gc_log \
-XX:+DisableExplicitGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:+PrintGCDetails \
-XX:+PrintGCTimeStamps \
-XX:+UseConcMarkSweepGC \
-XX:+UseParNewGC \
-XX:CMSInitiatingOccupancyFraction=50 \
-XX:GCTimeRatio=99 \
-XX:MaxNewSize=512m \
-XX:MaxTenuringThreshold=30 \
-XX:NewSize=512m \
-XX:SurvivorRatio=6 \
-XX:TargetSurvivorRatio=90 \
**495747.455: [CMS-concurrent-mark-start]
495749.159: [CMS-concurrent-mark: 1.705/1.705 secs] [Times: user=1.91 sys=0.05, real=1.71 secs]
495749.159: [CMS-concurrent-preclean-start]
495749.166: [CMS-concurrent-preclean: 0.006/0.007 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
495749.166: [CMS-concurrent-abortable-preclean-start]
495752.728: [GC 495752.728: [ParNew: 432226K->29458K(458752K), 0.0462900 secs] 1419590K->1016821K(1507328K), 0.0464200 secs] [Times: user=0.08 sys=0.00, real=0.04 secs]
CMS: abort preclean due to time 495754.230: [CMS-concurrent-abortable-preclean: 2.067/5.063 secs] [Times: user=2.43 sys=0.11, real=5.06 secs]
495754.230: [GC[YG occupancy: 146431 K (458752 K)]495754.230: [Rescan (parallel) , 0.0446310 secs]495754.275: [weak refs processing, 0.0000080 secs] [1 CMS-remark: 987363K(1048576K)] 1133794K(1507328K), 0.0447400 secs] [Times: user=0.07 sys=0.00, real=0.05 secs]**
答案 0 :(得分:2)
可堕胎的预清洁是可以流产的。这可能是一个问题,但我怀疑你最不担心。
如果在完整GC之后没有清理内存,因为这个内存被保留在某个地方。我会做一个堆转储,看看为什么要保留这个内存。即你有资源。
当你在调查我会尝试增加可用内存时。例如新的2 GB大小和2 GB的终身空间。较大的年轻一代将减少进入终身空间并需要稍后清理的物体数量。
我不会尝试调整这么多参数,因为JVM可以相当有效地配置自己。
答案 1 :(得分:1)
看起来像是this question
的副本我认为问题在于2个参数
-XX:CMSInitiatingOccupancyFraction=50
如果Tenured generation的占用率超过此值,则会调用并发收集。可能是占用率一直超过50%,这反复调用集合,导致完整的GC。 (默认值为68%)
-XX:GCTimeRatio=99
错误可能是因为此参数,因为GC时间比率为1%且预清洁相位在5秒内耗时约2秒,因此预清洁可能由于超时而中止。 (我认为默认值是5%)
增加Xmx应该可以解决这个问题,但是我同意Peter Lawrey的说法,除非你非常确定标志如何影响工作,否则你不应该这么调整JVM。 另请阅读this link on GC tuning