某些時候,Application Server運行一段時間后,會出現PermGen OOM的現象。所謂PermGen,它是Sun/HP JDK中獨有的,用于保存class原數據信息的地方,class被load后,數據信息會被放入perm中,而不是OldGen或YoungGen。一般情況下,fullGC會觸發perm的GC,即輔助清理那些沒必要的類,以便降低perm的開銷,而由于jdk的自身原因,fullGC不觸發permGC的情況也是存在的,如何保證perm中的無用類信息會被清除呢,可以試試下面的幾個參數(紅色標注),
-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的開銷,我們通常需要定位這些開銷是泄漏還是應用自身需要。對于泄漏(比如動態生成的類太多,用完之后不再使用,我們需要優化應用、框架,看看是否可以避免這些問題),如果應用自身對于perm的需求就比較大(比如應用包很大,類很多),那么上面的參數一般是無法幫助我們降低perm開銷,這時候,我們能做的就是逐漸加大perm size, 直到一個能讓系統穩定的值。
posted on 2009-04-14 10:46
走走停停又三年 閱讀(1353)
評論(1) 編輯 收藏 所屬分類:
Java Technology