java中OutOfMemory種類和解決方法
1、永久區溢出 Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
這部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區域(包括常量池: 靜態變量),它和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP要LOAD很多CLASS的話,就很可能出現PermGen space錯誤。
這種錯誤常見在web服務器對JSP進行pre compile的時候。
可以通過設置jvm啟動參數來解決: -XX:MaxPermSize=256m
2、堆溢出 java.lang.OutOfMemoryError: Java heap space
這部分用于存放類的實例。被緩存的實例(Cache)對象,大的map,list引用大的對象等等,都會保存于此。
堆內存會在jvm啟動時自動設置,初始值 -Xms為物理內存的1/64,最大值-Xmx為1/4;可以通過參數-Xmn、-Xms、-Xmx設置,一般-Xms和-Xmx不超過80%,-Xmn為-Xmx的1/4;
3、棧溢出 Exception in thread "main" java.lang.StackOverflowError
這部分用于存放局部變量、方法棧幀信息。棧幀太多,也就是函數調用層級過多時就會出現此異常,檢查是否有死遞歸的情況。
對應的啟動參數為:-Xss ( JDK1.5以后默認是1M,之前是256K)
以下是1G內存環境下java jvm 的參數設置參考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true