當前位置:
首頁 > 知識 > 一文了解 OutOfMemory 及解決方案

一文了解 OutOfMemory 及解決方案

(給

ImportNew

加星標,提高Java技能)


來自:唐尤華


譯自:https://bloggceasy.files.wordpress.com/2015/05/outofmemoryerror2.pdf

1. Java 堆空間

發生頻率


5顆星



造成原因




  1. 無法在 Java 堆中分配對象



  2. 吞吐量增加



  3. 應用程序無意中保存了對象引用,對象無法被 GC 回收



  4. 應用程序過度使用 finalizer。finalizer 對象不能被 GC 立刻回收。finalizer 由結束隊列服務的守護線程調用,有時 finalizer 線程的處理能力無法跟上結束隊列的增長



解決方案



單位對應:GB -> G, g;MB -> M, m;KB -> K, k




  1. 使用 -Xmx 增加堆大小



  2. 修復應用程序中的內存泄漏



2. GC 開銷超過限制

發生頻率


5顆星



造成原因



  1. Java 進程98%的時間在進行垃圾回收,恢復了不到2%的堆空間,最後連續5個(編譯時常量)垃圾回收一直如此。



解決方案





  1. 使用 -Xmx 增加堆大小



  2. 使用 -XX:-UseGCOverheadLimit 取消 GC 開銷限制



  3. 修復應用程序中的內存泄漏



3. 請求的數組大小超過虛擬機限制

發生頻率


2顆星

造成原因




  1. 應用程序試圖分配一個超過堆大小的數組


解決方案




  1. 使用 -Xmx 增加堆大小



  2. 修復應用程序中分配巨大數組的 bug



4. Permgen 空間

發生頻率


3顆星


造成原因


Permgen 空間包含:




  • 類的名字、欄位、方法



  • 與類相關的對象數組和類型數組



  • JIT 編譯器優化



當 Permgen 空間用盡時,將拋出異常。



解決方案




  1. 使用 -XX: MaxPermSize 增加 Permgen 大小



  2. 不重啟應用部署應用程序可能會導致此問題。重啟 JVM 解決


5. Metaspace

發生頻率


3顆星



造成原因




  1. 從 Java 8 開始 Permgen 改成了 Metaspace,在本機內存中分配 class 元數據(稱為 metaspace)。如果 metaspace 耗盡,則拋出異常



解決方案




  1. 通過命令行設置 -XX: MaxMetaSpaceSize 增加 metaspace 大小



  2. 取消 -XX: maxmetsspacedize



  3. 減小 Java 堆大小,為 MetaSpace 提供更多的可用空間



  4. 為伺服器分配更多的內存



  5. 可能是應用程序 bug,修復 bug



6. 無法新建本機線程



發生頻率


5顆星



造成原因




  1. 內存不足,無法創建新線程。由於線程在本機內存中創建,報告這個錯誤表明本機內存空間不足

解決方案




  1. 為機器分配更多的內存



  2. 減少 Java 堆空間



  3. 修復應用程序中的線程泄漏。



  4. 增加操作系統級別的限制




    • ulimit -a



    • 用戶進程數增大 (-u) 1800



  5. 使用 -Xss 減小線程堆棧大小



7. 殺死進程或子進程



發生頻率


1顆星



造成原因




  1. 內核任務:內存不足結束器,在可用內存極低的情況下會殺死進程



解決方案




  1. 將進程遷移到不同的機器上



  2. 給機器增加更多內存



與其他 OOM 錯誤不同,這是由操作系統而非 JVM 觸發的。



8. 發生 stack_trace_with_native_method

發生頻率


1顆星



造成原因




  1. 本機方法(native method)分配失敗



  2. 列印的堆棧跟蹤信息,最頂層的幀是本機方法



解決方案




  1. 使用操作系統本地工具進行診斷

看完本文有收穫?請轉發分享給更多人


關注「ImportNew」,提升Java技能



喜歡就點「好看」唄~



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ImportNew 的精彩文章:

Apache Commons IO 入門教程
微服務架構下靜態數據通用緩存機制

TAG:ImportNew |