2013-04-09 33 views
2

我有一個應用程序在啓動時運行兩個或三個完整的GC。有很多堆空間,並且不需要運行任何GC(次要或全部)。然而在gc log上,我可以看到permgen被裝滿,然後立即運行完整的GC。之後,permgen空間增加。最終,一旦所有類都加載完畢,就不會再有完整的GC了。如果permgen填滿,GC會運行嗎?

我的問題是,如果permgen被填滿,虛擬機是否運行GC從堆中索取一些內存並向permgen添加額外內存?或者它會拋出OutOfMemory-permgen?

+0

看起來,如果您最初增加MaxPermGen,則可以避免使用這些GC – arahant 2013-04-09 05:42:52

回答

0

如果PermGen大小達到-XX:MaxPermGen限制(或默認值),它將拋出OOM-permgen。

3

我的問題是,如果permgen被填滿,虛擬機是否運行GC從堆中索取一些內存並向permgen添加額外內存?或者它會拋出OutOfMemory-permgen?

GC將運行完整的GC,試圖釋放permgen空間中的某些內存。如果不能釋放足夠的空間,將會拋出一個OOME來表示該Permgen已滿。

沒有當前或過去的HotSpot JVM會嘗試增加permgen超過其規定的限制,無論是否有正常的堆空間來允許這樣做。


,一個完整的GC需要OOME(PermGen的)之前發生的原因是:

  • 有可能已引用的PermGen非PermGen的空間物體。運行一個完整的GC檢查這一點。無論如何,GC'ing the permgen通常與完整的GC聯繫在一起......推測是出於同樣的原因。它通常是來自普通堆和GC「根」的引用,用於保持permgen對象可達。

PermGen的對象是(AFAIK)通常不變的,所以變化可達性由於PermGen的對象突變是不可能的。