某些時候,Application Server運行一段時間后,會出現(xiàn)PermGen OOM的現(xiàn)象。所謂PermGen,它是Sun/HP JDK中獨有的,用于保存class原數(shù)據(jù)信息的地方,class被load后,數(shù)據(jù)信息會被放入perm中,而不是OldGen或YoungGen。一般情況下,fullGC會觸發(fā)perm的GC,即輔助清理那些沒必要的類,以便降低perm的開銷,而由于jdk的自身原因,fullGC不觸發(fā)permGC的情況也是存在的,如何保證perm中的無用類信息會被清除呢,可以試試下面的幾個參數(shù)(紅色標(biāo)注),
-Xms384M -Xmx384M -XX:NewSize=64M -XX:MaxNewSize=64M -XX:PermSize=64m -XX:MaxPermSize=64m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+CMSPermGenPrecleaningEnabled -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+TraceClassLoading -XX:+TraceClassUnloading
對于PermGen的開銷,我們通常需要定位這些開銷是泄漏還是應(yīng)用自身需要。對于泄漏(比如動態(tài)生成的類太多,用完之后不再使用,我們需要優(yōu)化應(yīng)用、框架,看看是否可以避免這些問題),如果應(yīng)用自身對于perm的需求就比較大(比如應(yīng)用包很大,類很多),那么上面的參數(shù)一般是無法幫助我們降低perm開銷,這時候,我們能做的就是逐漸加大perm size, 直到一個能讓系統(tǒng)穩(wěn)定的值。