2011-11-15 14 views
1

我遇到了堆内存问题。日常内存增加了100MB,并继续增加,在1.5GB的限制后运行FULL GC,但仍然没有恢复。 检查日志后,看到CMS:中止预清洁?这可能是因素。 任何帮助表示赞赏。垃圾收集器:CMS中止预清洁问题?

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

将终止执行预清洁时可中止。这可能是一个问题,但我最担心的是你的担心。

如果完整GC之后内存没有被清理,那是因为这个内存被保留在某个地方。我会做一个堆转储,看看为什么这个内存被保留。即有您持有的资源。

当你正在研究,我会尝试增加可用内存。例如一个2 GB的新尺寸和2 GB的终身空间。较大的年轻一代会减少进入终身空间的物品数量,并且需要稍后清理。

我不会尝试调整很多参数,因为JVM可以相当有效地进行自我配置。

+0

我试图与2GB,但在到达极限之后:(并发模式故障):1048575K-> 1048296K(1048576K),5.4770550秒] 1506365K-> 1244278K(1507328K),[CMS彼尔姆:43867K- 43862K(76736K)],5.4773220秒] [时间:用户= 5.40 sys = 0.02,实际= 5.46秒] 498938.770:[Full GC 498938.770:[CMS:1048442K-> 1048251K(1048576K),4.5968810sec] 1507194K-> 1252719K(1507328K),[CMS Perm:43870K-> 43866K(76736K)],4.5971510秒] [时间:用户= 4.56 sys = 0.01,实际= 4.61秒] 498943.375:[GC [1 CMS-初始标记:1048251K (1048576K)] 1255332K(1507328K),1.1042510秒] [Times:user = 1.10 sys = 0.01,real = 1.10 secs] – Dhanu

+0

AFAIK,这种情况发生在您宣传物品的速度快于将物品清理干净时。年轻的空间有多大? –

+0

-XX:MaxNewSize = 512m \这有助于年轻的空间。 – Dhanu

1

貌似的this question

重复我认为这个问题是有两个参数的

-XX:CMSInitiatingOccupancyFraction=50 

如果年老代的占用超过这个值,并发收集被调用。这可能是占用率一直超过50%,这反复地调用收藏,导致完整的GC。 (这样做的默认值是68%)

-XX:GCTimeRatio=99 

错误可能是因为这个参数的,作为GC时间比为1%和预清洗PHACE已采取〜2秒的5秒,所以预清洗可能因超时而中止。 (我认为默认值是5%)

增加Xmx应该可以解决这个问题,但我同意Peter Lawrey的观点,您不应该调整JVM,除非您非常确定这些标志如何影响工作。 还做读this link on GC tuning