我有一個應用程序在啓動時運行兩個或三個完整的GC。有很多堆空間,並且不需要運行任何GC(次要或全部)。然而在gc log上,我可以看到permgen被裝滿,然後立即運行完整的GC。之後,permgen空間增加。最終,一旦所有類都加載完畢,就不會再有完整的GC了。如果permgen填滿,GC會運行嗎?
我的問題是,如果permgen被填滿,虛擬機是否運行GC從堆中索取一些內存並向permgen添加額外內存?或者它會拋出OutOfMemory-permgen?
我有一個應用程序在啓動時運行兩個或三個完整的GC。有很多堆空間,並且不需要運行任何GC(次要或全部)。然而在gc log上,我可以看到permgen被裝滿,然後立即運行完整的GC。之後,permgen空間增加。最終,一旦所有類都加載完畢,就不會再有完整的GC了。如果permgen填滿,GC會運行嗎?
我的問題是,如果permgen被填滿,虛擬機是否運行GC從堆中索取一些內存並向permgen添加額外內存?或者它會拋出OutOfMemory-permgen?
如果PermGen大小達到-XX:MaxPermGen限制(或默認值),它將拋出OOM-permgen。
我的問題是,如果permgen被填滿,虛擬機是否運行GC從堆中索取一些內存並向permgen添加額外內存?或者它會拋出OutOfMemory-permgen?
GC將運行完整的GC,試圖釋放permgen空間中的某些內存。如果不能釋放足夠的空間,將會拋出一個OOME來表示該Permgen已滿。
沒有當前或過去的HotSpot JVM會嘗試增加permgen超過其規定的限制,無論是否有正常的堆空間來允許這樣做。
,一個完整的GC需要OOME(PermGen的)之前發生的原因是:
PermGen的對象是(AFAIK)通常不變的,所以變化可達性由於PermGen的對象突變是不可能的。
看起來,如果您最初增加MaxPermGen,則可以避免使用這些GC – arahant 2013-04-09 05:42:52