Java內存溢出

中間件應用Java內存溢出常見的三種狀況:
1.OutOfMemoryError: Java heap space
2.OutOfMemoryError: PermGen space
3.OutOfMemoryError: unable to create new native thread.java

第一種:堆溢出
提示:在JVM中若是98%的時間是用於GC且可用的Heap size不足2%的時候將拋出此異常信息
提示:Heap Size最大不要超過可用物理內存的80%,通常的要將-Xms和-Xmx選項設置爲相同,而-Xmn爲1/4的-Xmx值
沒有內存泄露的狀況下,調整-Xms -Xmx參數能夠解決,通常配置成同樣比較好
-Xms:初始堆大小
-Xmx:最大堆大小
但堆的大小受下面三方面影響:
1.相關操做系統的數據模型(x86或x86_64)限制
2.系統的可用虛擬內存限制
3.系統的可用物理內存限制
堆的大小可使用java -Xmx***M version命令來測試,支持的話會出現jdk的版本號,不支持會報錯web

第二種:永久保存區域溢出
PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域
用於存放Class和Meta的信息,Class在被Load的時候被放入PermGen space區域,它和存放Instance的Heap區域不一樣,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,因此若是應用會Load不少Class的話,就極可能出現PermGen space錯誤。
這種錯誤常見在web服務器對JSP進行pre compile的時候。
通常是加大-XX:PermSize -XX:MaxPermSize來解決問題。
-XX:PermSize 永久保存區域初始大小
-XX:MaxPermSize 永久保存區域初始最大值
有一點須要注意:-Xmx + -XX:PermSize <= 系統支持的jvm堆大小服務器

第三種:沒法建立新的線程
這種現象比較少見,主要是和jvm與系統內存的比例有關jvm

JVM內存設置方法:
直接編輯TOMCAT_HOME/bin/catalina.[sh|bat]
set JAVA_OPTS=""
參數說明:
-server:必定要做爲第一個參數,在多個CPU時性能佳
-Xms:初始Heap大小,使用的最小內存,cpu性能高時此值應設的大一些
-Xmx:Heap最大值,使用的最大內存
-XX:PermSize:設定內存的永久保存區域
-XX:MaxPermSize:設定最大內存的永久保存區域
-XX:MaxNewSize:
+XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。
-Xss:每一個線程的Stack大小
-verbose:gc 現實垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日誌文件
-Xmn:young generation的heap大小,通常設置爲Xmx的三、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間,提示:此選項在Heap Size 比較大並且Major收集時間較長的狀況下使用更合適。性能

相關文章
相關標籤/搜索