2010-09-14 102 views
5
Operation System: Red Hat Linux 4.8 

CPU Info: Intel(R) Xeon(R) CPU 5160 @ 3.00GHz X 16 

JDK version: "1.5.0_16" 

JVM Parameter: 
-server 
-Xmx1024m 
-Xms1024m 
-XX:NewSize=256m 
-XX:MaxNewSize=256m 
-XX:PermSize=128m 
-XX:MaxPermSize=128m 
-XX:SurvivorRatio=8 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+UseConcMarkSweepGC 
-XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction=5 
-XX:CMSInitiatingOccupancyFraction=60 
-XX:CMSMaxAbortablePrecleanTime=5 
-XX:+CMSPermGenSweepingEnabled 
-XX:+CMSClassUnloadingEnabled 
-XX:MaxGCPauseMillis=1500 

JVM GC Log: 

945188.489: [GC 945188.489: [ParNew: 224543K->14968K(235968K), 0.0506680 secs] 552200K->344514K(1022400K), 0.0507700 secs] 

945242.102: [GC 945242.102: [ParNew: 224760K->15374K(235968K), 0.0632410 secs] 554306K->346710K(1022400K), 0.0633450 secs] 

945270.397: [GC 945270.402: [ParNew: 225163K->225163K(235968K), 0.0000230 secs]945270.402: [CMS (concurrent mode failure)[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor70] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor58] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor38] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor62] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor54] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor74] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor53] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor73] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor64] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor39] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor59] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor51] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor42] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor48] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor76] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor52] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor57] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor61] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor56] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor55] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor63] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor60] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor40] 
[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor65] 
: 331336K->71676K(786432K), 13.8120660 secs] 556499K->71676K(1022400K), 13.8122360 secs] 

945289.234: [GC 945289.234: [ParNew: 209792K->2581K(235968K), 0.0065240 secs] 281468K->74257K(1022400K), 0.0066160 secs] 

945324.703: [GC 945324.703: [ParNew: 212373K->3829K(235968K), 0.0081040 secs] 284049K->75506K(1022400K), 0.0082040 secs] 

爲什麼CMS(併發模式故障)在這裏發生?爲什麼CMS(併發模式故障)在這裏發生?

老一代似乎:331336K-> 71676K

回答

9

Concurrent Mode Failure所定義(786432K)

「併發模式失敗」 表示的消息,該併發 收集年老代 的在終身 世代變得完整之前沒有完成。

換句話說,新一代充滿速度太快,它已經到了終身代代,但CMS無法在後臺清除終身代。

在你的情況下,在945270.397

ParNew: 225163K->225163K(235968K)顯示了年輕的充滿並不能明確對象的。

更新

類似log to yours is explained這裏說

這表明,ParNew集合 請求,但沒有嘗試。 (原因是,據估計 ,有沒有在 CMS生成足夠的空間來促進 最壞情況下的倖存年輕一代 對象。)我們稱這個故障「全 推進保障失敗」。結果,CMS的併發模式被中斷,並調用完整的GC。

因此,當我看到它時,225M的年輕物體以及331K的Tenured的完整GC需要13秒鐘,並將堆積降至71 M,但這是併發模式的結果故障

建議

如果你真的建立這麼多的老物件,那麼你可能需要一個更大的堆。

或減少嘗試減少-XX:從60 CMSInitiatingOccupancyFraction,但不認爲這會讓DIFF

+0

謝謝你的答案了。 我的終身已經分配了786432k(768m)的內存。 你在哪裏看到'老去330Mb到716Mb'? – user447044 2010-09-14 07:48:20

+0

Ah我錯誤地把71676K算作716 M,實際上是71 M. – JoseK 2010-09-14 08:05:22

+0

331336K-> 71676K(786432K),這意味着在gc之前,Tenured使用了331336k,在gc之後,Tenured使用了71676k。而我的終身已分配786432k。 所以問題出現了,331336/786432 = 42%的終身使用,但爲什麼CMS(併發模式失敗)在這裏發生? – user447044 2010-09-14 08:22:36