OutOfMemoryError的原因有哪些?怎么解決?


OutOfMemoryError 分為多種不同的錯誤:

 

  • Java heap space

原因:JVM 中 heap 的最大值不滿足需要
解決:
調高 heap 的最大值,-Xmx 的值調大
如果程序存在內存泄漏,增加 heap 空間也只是推遲該錯誤出現的時間而已,要檢查程序是否存在內存泄漏

 

  • GC overhead limit exceeded

原因:JVM 在 GC 時,對象過多,導致內存溢出
解決:調整 GC 的策略,在一定比例下開始GC而不使用默認的策略,或將新代和老代設置合適的大小,可以微調存活率。如在老代 80% 時就是開始GC,並且將 -XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)設置的更合理

 

  • Java perm space

原因:JVM 中 perm 的最大值不滿足需要,perm 一般是在 JVM 啟動時加載類進來
解決:調高 heap 的最大值,即 -XX:MaxPermSize 的值調大解決。如果 JVM 運行較長一段時間而不是剛啟動后溢出的話,很有可能是由於運行時有類被動態加載,此時可以用 CMS 策略中的類卸載配置解決如:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

 

  • unable to create new native thread

原因:當 JVM 向系統請求創建一個新線程時,系統內存不足無法創建新的 native 線程
解決:JVM 內存調的過大或者可利用率小於 20%,可以將 heap 及 perm 的最大值下調,並將線程棧內存 -Xss 調小,如:-Xss128k

 

  • Requested array size exceeds VM limit

原因:應用程序試圖分配一個大於堆大小的數組
解決:
檢查 heap 的 -Xmx 是不是設置的過小
heap 的 -Xmx 已經足夠大,檢查應用程序是不是存在 bug 計算數組的大小時存在錯誤,導致數組的 length 很大,從而導致申請巨大的數組

 

  • request XXX bytes for XXX. Out of swap space

原因:從 native 堆中分配內存失敗,並且堆內存可能接近耗盡,操作系統配置了較小的交換區,其他進程消耗所有的內存
解決:檢查操作系統的 swap 是不是沒有設置或者設置的過小;檢查是否有其他進程在消耗大量的內存,導致 JVM 內存不夠分配


原文鏈接
 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM