我正在分析一個需要很長時間並且展示偶爾的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提交增量如此之小和固定?
兩點:1。PermGen的大小不減少,我的同事們觀察到了這一點。可能與自動生成的類有關。 2.當燙髮內存壓力過高時,完整收集將被啓動。是否收集permgen並不重要;當提交大小需要增加時,jvm會進行全面收集。我有非常有力的證據表明,增加開始permgen大小減少了完整收集的數量,其他條款。 – 2012-09-01 20:21:14