分享解決Java編程對OOM的場景
在學習編程的過程中,我覺得不止要獲得課本的知識,更多的是解決問題的方法,面對新問題該怎麼解決,這樣我們才能走在最前方,我是達內的學員,感謝你對本博客的支持;
1、OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heap space
分 析
此OOM是由於JVM中heap的最大值不滿足需要,將設置heap的最大值調高即可,參數樣例爲:-Xmx2G
解決方法
調高heap的最大值,即-Xmx的值調大。2、OOM for Perm=>例如java.lang.OutOfMemoryError: Java perm space
分 析
此OOM是由於JVM中perm的最大值不滿足需要,將設置perm的最大值調高即可,參數樣例爲:-XX:MaxPermSize=512M
解決方法
調高heap的最大值,即-XX:MaxPermSize的值調大。
另外,注意一點,Perm一般是在JVM啓動時加載類進來,如果是JVM運行較長一段時間而不是剛啓動後溢出的話,很有可能是由於運行時有類被動態加載進來,此時建議用CMS策略中的類卸載配置。
如:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled3、OOM for GC=>例如:java.lang.OutOfMemoryError: GC overhead limit exceeded
分 析
此OOM是由於JVM在GC時,對象過多,導致內存溢出,建議調整GC的策略,在一定比例下開始GC而不要使用默認的策略,或者將新代和老代設置合適的大小,需要進行微調存活率。
解決方法
改變GC策略,在老代80%時就是開始GC,並且將-XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)設置的更合理。4、OOM for native thread created=>
如:java.lang.OutOfMemoryError: unable to create new native thread
分 析
參考如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一個進程的最大內存
JVMMemory JVM內存
ReservedOsMemory 保留的操作系統內存
ThreadStackSize 線程棧的大小
如果JVM內存調的過大或者可利用率小於20%,可以建議將heap及perm的最大值下調,並將線程棧調小,即-Xss調小,如:-Xss128k
解決方法
在JVM內存不能調小的前提下,將-Xss設置較小,如:-Xss:128k
5、OOM for allocate huge array=>例如:Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit
分 析
此類信息表明應用程序(或者被應用程序調用的APIs)試圖分配一個大於堆大小的數組。例如,如果應用程序new一個數組對象,大小爲512M,但是最大堆大小爲256M,因此OutOfMemoryError會拋出,因爲數組的大小超過虛擬機的限制。
解決方法
(1)、首先檢查heap的-Xmx是不是設置的過小
(2)、如果heap的-Xmx已經足夠大,那麼請檢查應用程序是不是存在bug,例如:應用程序可能在計算數組的大小時,存在算法錯誤,導致數組的size很大,從而導致巨大的數組被分配。
6、 OOM for small swap=>例如:Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?
分 析
拋出這類錯誤,是由於從native堆中分配內存失敗,並且堆內存可能接近耗盡。這類錯誤可能跟應用程序沒有關係,例如下面兩種原因也會導致錯誤的發生:
(1)操作系統配置了較小的交換區
(2)系統的另外一個進程正在消耗所有的內存
解決方法
(1)、檢查os的swap是不是沒有設置或者設置的過小
(2)、檢查是否有其他進程在消耗大量的內存,從而導致當前的JVM內存不夠分配。
注意:雖然有時<reason>部分顯示導致OOM的原因,但大多數情況下,<reason>顯示的是提示分配失敗的源模塊的名稱,所以有必要查看日誌文件,如crash時的hs文件。
知識就是力量,別人學用知識來賺錢的成本低,在達內學習到編程是鑄造夢想的地方,如果你喜歡編程,這裏,有我們共同語言,共同的故事,共同的夢想!
(責任編輯:廣州達內http://www.jvtarena.com/)
1、OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heap space
分 析
此OOM是由於JVM中heap的最大值不滿足需要,將設置heap的最大值調高即可,參數樣例爲:-Xmx2G
解決方法
調高heap的最大值,即-Xmx的值調大。2、OOM for Perm=>例如java.lang.OutOfMemoryError: Java perm space
分 析
此OOM是由於JVM中perm的最大值不滿足需要,將設置perm的最大值調高即可,參數樣例爲:-XX:MaxPermSize=512M
解決方法
調高heap的最大值,即-XX:MaxPermSize的值調大。
另外,注意一點,Perm一般是在JVM啓動時加載類進來,如果是JVM運行較長一段時間而不是剛啓動後溢出的話,很有可能是由於運行時有類被動態加載進來,此時建議用CMS策略中的類卸載配置。
如:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled3、OOM for GC=>例如:java.lang.OutOfMemoryError: GC overhead limit exceeded
分 析
此OOM是由於JVM在GC時,對象過多,導致內存溢出,建議調整GC的策略,在一定比例下開始GC而不要使用默認的策略,或者將新代和老代設置合適的大小,需要進行微調存活率。
解決方法
改變GC策略,在老代80%時就是開始GC,並且將-XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)設置的更合理。4、OOM for native thread created=>
如:java.lang.OutOfMemoryError: unable to create new native thread
分 析
參考如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一個進程的最大內存
JVMMemory JVM內存
ReservedOsMemory 保留的操作系統內存
ThreadStackSize 線程棧的大小
如果JVM內存調的過大或者可利用率小於20%,可以建議將heap及perm的最大值下調,並將線程棧調小,即-Xss調小,如:-Xss128k
解決方法
在JVM內存不能調小的前提下,將-Xss設置較小,如:-Xss:128k
5、OOM for allocate huge array=>例如:Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit
分 析
此類信息表明應用程序(或者被應用程序調用的APIs)試圖分配一個大於堆大小的數組。例如,如果應用程序new一個數組對象,大小爲512M,但是最大堆大小爲256M,因此OutOfMemoryError會拋出,因爲數組的大小超過虛擬機的限制。
解決方法
(1)、首先檢查heap的-Xmx是不是設置的過小
(2)、如果heap的-Xmx已經足夠大,那麼請檢查應用程序是不是存在bug,例如:應用程序可能在計算數組的大小時,存在算法錯誤,導致數組的size很大,從而導致巨大的數組被分配。
6、 OOM for small swap=>例如:Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?
分 析
拋出這類錯誤,是由於從native堆中分配內存失敗,並且堆內存可能接近耗盡。這類錯誤可能跟應用程序沒有關係,例如下面兩種原因也會導致錯誤的發生:
(1)操作系統配置了較小的交換區
(2)系統的另外一個進程正在消耗所有的內存
解決方法
(1)、檢查os的swap是不是沒有設置或者設置的過小
(2)、檢查是否有其他進程在消耗大量的內存,從而導致當前的JVM內存不夠分配。
注意:雖然有時<reason>部分顯示導致OOM的原因,但大多數情況下,<reason>顯示的是提示分配失敗的源模塊的名稱,所以有必要查看日誌文件,如crash時的hs文件。
知識就是力量,別人學用知識來賺錢的成本低,在達內學習到編程是鑄造夢想的地方,如果你喜歡編程,這裏,有我們共同語言,共同的故事,共同的夢想!
(責任編輯:廣州達內http://www.jvtarena.com/)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.