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.cnblogs.com/cx361/archive/2011/12/02/2271889.html
相關文章
- Java中關於OOM的場景及解決方法JavaOOM
- JAVA各種OOM程式碼樣例及解決方法JavaOOM
- 面試官:哪些場景會產生OOM?怎麼解決?面試OOM
- 關於java中空指標異常的原因及解決方法Java指標
- Java 自定義註解及使用場景Java
- 關於Java中的equals方法Java
- @Transactional詳解(作用、失效場景與解決方法)
- 關於EJB查詢返回值的解決方法 (轉)
- 基於場景的設計方法
- [轉]關於java中的 sychronized 同步方法 與 同步塊的理解JavaZed
- 關於java 的 Classpath全解 (轉)Java
- 關於android 使用bitmap的OOM心得和解決方案AndroidOOM
- 關於Centos7中Vscode無響應的問題及解決方法CentOSVSCode
- 關於iOS中的執行緒安全和使用場景iOS執行緒
- 關於Java中的@Deprecated註解Java
- 關於Mysql 4.1語言問題的完美解決方法(轉)MySql
- Java程式中的代理作用和應用場景及實現Java
- MySQL 在併發場景下的問題及解決思路MySql
- MySQL在併發場景下的問題及解決思路MySql
- WCF中關於HttpContext.Current為空的解決方法HTTPContext
- 有關於JAVA中的CLASSPATH的作用 (轉)Java
- 關於.NET中WinForms裡面的ListBox實現資料繫結的解決方法 (轉)ORM
- 就這?Spring 事務失效場景及解決方案Spring
- spring mvc中關於url中傳遞中文亂碼的解決方法SpringMVC
- 關於教程中 NPM 下載不穩定個人的解決方法NPM
- 關於FORM中錄入漢字易當機的解決方法ORM
- 關於3d場景重建3D
- 關於人工智慧技術應用場景的個人見解人工智慧
- 關於在頁面中解決列印的幾個問題 (轉)
- formily-面向中後臺場景的複雜解決方案ORM
- sql中in和exists的原理及使用場景。SQL
- 詳解數倉中sequence的應用場景及最佳化
- 關於npm install失敗的解決方法NPM
- 關於監聽不能啟動的解決方法
- Java中關於十進位制數取反問題解決Java
- 場景在關卡設計中的比重
- JS中toFixed()方法的問題及解決方案JS
- 關於MySQL-MMM架構的一些報錯及解決方法薦MySql架構