java中OutOfMemory種類和解決方法

jopen 8年前發布 | 7K 次閱讀 Java開發

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



來自: http://my.oschina.net/kimspan/blog/599073

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!