2012-08-08 24 views
3

我正在分析一個需要很長時間並且展示偶爾的OOM(在C堆中,而不是Java)的java函數測試,並且我在java串行GC中發現了一個非常不理想的行爲(並且它可能適用於所有java GC 。)爲什麼如此小的PermGen Commit增量?

下面是從試運行(以KB大小)全GC點PermGen的統計樣本:

before after commit 
167935 167935 167936 
172031 172031 172032 

正如你所看到的,PermGen的空間中,無法通過這些充滿GC運行清理。不是什麼大不了的,但它指向這些完整的gc是無用的。另外,提交值有點有趣。我認爲gc日誌條目的提交值是提交大小增加後的值。我現在認爲它實際上是整個GC運行之前的提交值。

此外,我認爲每個完整的GC運行時,permgen提交大小增長的固定的,不可調整的大小爲4MB(172032K - 167936K)。這意味着如果你以默認的permgen大小(比如64mb)開始,並且當你的應用程序完全啓動時它需要128mb的permgen,那麼需要16個完整的gc才能達到它的最終提交大小。

在功能測試的情況下,我正在分析,58個完整的gc必須運行,每個需要0.5到2秒。通過將jvm參數-XX:PermSize等於-XX:MaxPermSize,我可以將其減少到零全部GC(不會顯着增加快得多的新一代gc),並減少gc儀器報告的GC時間消息90%,從90秒到9秒。

我看了很多地方,但我無法找到permgen堆提交大小增長率的不同調整參數。在程序啓動時完全分配permgen堆的最大可能大小是很難看的。有沒有人知道增加PermSize等於MaxPermSize的替代方法,該方法在啓動時不會分配太多內存就可以實現類似的結果?爲什麼permgen提交增量如此之小和固定?

回答

0

Permgen不是垃圾收集。 (在正常情況下)。 Permgen是Java運行時的實際類對象和其他'內臟'保存的地方。隨着應用程序初始化並使用各種類和/或罐被加載和/或使用,這些關聯的類文件基本上存儲在permgen中。

必須有與您的應用程序有關的其他相關參數來說明您的觀察結果。

permgen增加和垃圾收集之間確實沒有記錄的關係。 PermGen的是用於存儲JVM使用靜態數據和通常將不會被收集(除了在極少數情況下,即類加載器加載類,然後說的ClassLoader走出去的範圍)

+1

兩點:1。PermGen的大小不減少,我的同事們觀察到了這一點。可能與自動生成的類有關。 2.當燙髮內存壓力過高時,完整收集將被啓動。是否收集permgen並不重要;當提交大小需要增加時,jvm會進行全面收集。我有非常有力的證據表明,增加開始permgen大小減少了完整收集的數量,其他條款。 – 2012-09-01 20:21:14

相關問題