垃圾收集器:CMS中止预清洁问题?

时间:2011-11-15 14:11:47

标签: java garbage-collection

我遇到堆内存问题。日常内存增加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]**

2 个答案:

答案 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