簡體   English   中英

permgen垃圾收集需要多個Full GC

[英]permgen garbage collection takes multiple Full GC

我們正在運行grails,我們注意到需要多個完整的垃圾收集來清除permgen空間。

2013-06-06T16:11:27.016+0000: 32582.145: [Full GC 32582.145: [CMS2013-06-06T16:11:45.404+0000:     32600.532: [CMS-concurrent-mark: 21.403/86.063 secs] [Times: user=48.44 sys=0.63, real=86.07 secs]
(concurrent mode failure): 7585874K->7290466K(10145024K), 57.9230770 secs] 7866094K->7290466K(10451712K), [CMS Perm : 261766K->261702K(262144K)] icms_dc=30 , 57.9232150 secs] [Times: user=57.97 sys=0.00, real=57.93 secs]
2013-06-06T16:12:25.183+0000: 32640.311: [GC [1 CMS-initial-mark: 7290466K(10145024K)] 7385976K(10451712K), 0.0880890 secs] [Times: user=0.09 sys=0.00, real=0.08 secs]
2013-06-06T16:12:25.271+0000: 32640.400: [CMS-concurrent-mark-start]
2013-06-06T16:12:25.427+0000: 32640.555: [GC 32640.556: [ParNew: 272640K->10006K(306688K), 0.0622620 secs] 7563106K->7300472K(10451712K) icms_dc=30 , 0.0624140 secs] [Times: user=0.24 sys=0.00, real=0.06 secs]
2013-06-06T16:12:25.734+0000: 32640.863: [GC 32640.863: [ParNew: 282646K->13476K(306688K), 0.0648770 secs] 7573112K->7303942K(10451712K) icms_dc=30 , 0.0650170 secs] [Times: user=0.26 sys=0.00, real=0.07 secs]
2013-06-06T16:12:26.013+0000: 32641.142: [GC 32641.142: [ParNew: 286116K->11277K(306688K), 0.0607460 secs] 7576582K->7301743K(10451712K) icms_dc=30 , 0.0608870 secs] [Times: user=0.25 sys=0.00, real=0.06 secs]
2013-06-06T16:12:32.449+0000: 32647.577: [GC 32647.577: [ParNew: 283917K->17560K(306688K), 0.0672260 secs] 7574383K->7308026K(10451712K) icms_dc=30 , 0.0673710 secs] [Times: user=0.27 sys=0.00, real=0.07 secs]
2013-06-06T16:12:33.107+0000: 32648.236: [GC 32648.236: [ParNew: 290200K->22523K(306688K), 0.0686820 secs] 7580666K->7312989K(10451712K) icms_dc=30 , 0.0688200 secs] [Times: user=0.28 sys=0.00, real=0.07 secs]
2013-06-06T16:12:33.845+0000: 32648.974: [Full GC 32648.974: [CMS2013-06-06T16:12:52.516+0000: 32667.645: [CMS-concurrent-mark: 21.346/27.245 secs] [Times: user=27.55 sys=0.14, real=27.25 secs]
(concurrent mode failure): 7290466K->7293289K(10145024K), 57.7092090 secs] 7523492K->7293289K(10451712K), [CMS Perm : 262143K->262143K(262144K)] icms_dc=30 , 57.7093560 secs] [Times: user=57.76 sys=0.00, real=57.71 secs]
2013-06-06T16:13:31.557+0000: 32706.686: [Full GC 32706.686: [CMS: 7293289K->6960613K(10145024K), 37.1325250 secs] 7293289K->6960613K(10451712K), [CMS Perm : 262143K->91949K(262144K)] icms_dc=30 , 37.1326670 secs] [Times: user=37.19 sys=0.00, real=37.14 secs]

第一個收集只有64K,第二個收集什么然后最后,第三個收集170194K

JAVA_OPTIONS:
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 
-XX:+UseConcMarkSweepGC
-XX:MaxPermSize=256m 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDateStamps 
-verbose:gc,sizes 
-XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=80 
-XX:+DisableExplicitGC 
-XX:+CMSIncrementalMode 
-XX:+UseParNewGC  
-Xms10g -Xmx10g

另外,有沒有告訴讓垃圾收集器對permgen空間進行增量掃描? 我們只看到permgen在完整收藏期間被減少。

讓我澄清一下Concurrent Mark Sweep和它的增量模式算法。 引入CMS增量模式是為了避免在后台GC運行時單核服務器上的CPU飢餓。 不鼓勵使用增量CMS。

遞增模式不會逐漸釋放內存,它只是在標記掃描算法的標記階段進行長時間休眠。

-XX:+CMSPermGenSweepingEnabled已棄用且與-XX:+CMSClassUnloadingEnabled同義-XX:+CMSClassUnloadingEnabled

增量模式有點隱藏死對象檢測,我的問題。

此外,如果任何類(要卸載)有finilazer,這也可以解釋2個集合(JVM無法卸載單個類,整個類加載器被卸載,因此它的任何類都可以阻止收集)。

我建議你正確調整堆和perm gen的大小,並且如果你想保持堆利用率水平,那么將CMS配置為更積極。 我的博客中,您可以找到很少有關於調優CMS的建議。

但是,如果你運行時正在積極地生成和放棄類加載器,那么調整GC可能還不夠。

我在自動化測試中遇到了類似的問題(為了隔離,每個測試都在專用的類加載器中加載相同的類)。 測試通常是不穩定的,將OOME扔進了燙發器。 解決方案是強制JVM通過使用垃圾數據( 這里是代碼片段 )進行污染來清理perm gen。 它導致了Full GC - 可能不是你想看的東西。

BTW還有-XX:CMSClassUnloadingMaxInterval=N標志,它讓JVM只收集每個第N個集合的Perm gen。 但這不是你的情況,因為perm gen已經滿了。

識別最后一個FullGC集合中正在收集的內容的一種方法是在Full GC之前/之后打印類直方圖-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC

這樣,您可以比較所有集合中的直方圖,並確定在最后一個集合中收集的類。

對於考慮PermGen的第二個問題, 通常的建議是為您的應用程序/工作負載確定足夠大小的PermGen並堅持使用它。 您需要調查為什么有這么多對象被放入PermGen。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM