JVM 發生內存溢出的 8 種緣由、及解決辦法

閱讀本文大概須要 2.3 分鐘。

出處:割肉機html

cnblogs.com/williamjie/p/11164572.html程序員

  1. Java 堆空間
  2. GC 開銷超過限制
  3. 請求的數組大小超過虛擬機限制
  4. Perm gen 空間
  5. Metaspace
  6. 沒法新建本機線程
  7. 殺死進程或子進程
  8. 發生 stack_trace_with_native_method

1. Java 堆空間

發生頻率:5顆星
形成緣由
  • 沒法在 Java 堆中分配對象
  • 吞吐量增長
  • 應用程序無心中保存了對象引用,對象沒法被 GC 回收
  • 應用程序過分使用 finalizer。finalizer 對象不能被 GC 馬上回收。finalizer 由結束隊列服務的守護線程調用,有時 finalizer 線程的處理能力沒法跟上結束隊列的增加
解決方案
  • 使用 -Xmx 增長堆大小
  • 修復應用程序中的內存泄漏

2. GC 開銷超過限制

發生頻率:5顆星
形成緣由
  • Java 進程98%的時間在進行垃圾回收,恢復了不到2%的堆空間,最後連續5個(編譯時常量)垃圾回收一直如此。
解決方案
  • 使用 -Xmx 增長堆大小
  • 使用 -XX:-UseGCOverheadLimit 取消 GC 開銷限制
  • 修復應用程序中的內存泄漏

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

發生頻率:2顆星
形成緣由
  • 應用程序試圖分配一個超過堆大小的數組
解決方案
  • 使用 -Xmx 增長堆大小
  • 修復應用程序中分配巨大數組的 bug

4. Perm gen 空間

發生頻率:3顆星
形成緣由
Perm gen 空間包含:
  • 類的名字、字段、方法
  • 與類相關的對象數組和類型數組
  • JIT 編譯器優化
當 Perm gen 空間用盡時,將拋出異常。
解決方案
  • 使用 -XX: MaxPermSize 增長 Permgen 大小
  • 不重啓應用部署應用程序可能會致使此問題。重啓 JVM 解決

5. Metaspace

發生頻率:3顆星
形成緣由
  • 從 Java 8 開始 Perm gen 改爲了 Metaspace,在本機內存中分配 class 元數據(稱爲 metaspace)。若是 metaspace 耗盡,則拋出異常
解決方案
  • 經過命令行設置 -XX: MaxMetaSpaceSize 增長 metaspace 大小
  • 取消 -XX: maxmetsspacedize
  • 減少 Java 堆大小,爲 MetaSpace 提供更多的可用空間
  • 爲服務器分配更多的內存
  • 多是應用程序 bug,修復 bug

6. 沒法新建本機線程

發生頻率:5顆星
形成緣由
  • 內存不足,沒法建立新線程。因爲線程在本機內存中建立,報告這個錯誤代表本機內存空間不足
解決方案
  • 爲機器分配更多的內存
  • 減小 Java 堆空間
  • 修復應用程序中的線程泄漏。
  • 增長操做系統級別的限制
    • ulimit -a
    • 用戶進程數增大 (-u) 1800
  • 使用 -Xss 減少線程堆棧大小

7. 殺死進程或子進程

發生頻率:1顆星
形成緣由
  • 內核任務:內存不足結束器,在可用內存極低的狀況下會殺死進程
解決方案
  • 將進程遷移到不一樣的機器上
  • 給機器增長更多內存
  • 與其餘 OOM 錯誤不一樣,這是由操做系統而非 JVM 觸發的。

8. 發生 stack_trace_with_native_method

發生頻率:1顆星
形成緣由
  • 本機方法(native method)分配失敗
  • 打印的堆棧跟蹤信息,最頂層的幀是本機方法
解決方案
  • 使用操做系統本地工具進行診斷


·END·數組

程序員的成長之路服務器

路雖遠,行則必至微信

本文原發於 同名微信公衆號「程序員的成長之路」,回覆「1024」你懂得,給個讚唄。工具

回覆 [ 520 ] 領取程序員最佳學習方式學習

回覆 [ 256 ] 查看 Java 程序員成長規劃優化

相關文章
相關標籤/搜索