
來自:唐尤華 https://bloggceasy.files./2015/05/outofmemoryerror2.pdf
1. Java 堆空間發(fā)生頻率:5顆星造成原因無法在 Java 堆中分配對象 吞吐量增加 應(yīng)用程序無意中保存了對象引用,對象無法被 GC 回收 應(yīng)用程序過度使用 finalizer。finalizer 對象不能被 GC 立刻回收。finalizer 由結(jié)束隊列服務(wù)的守護(hù)線程調(diào)用,有時 finalizer 線程的處理能力無法跟上結(jié)束隊列的增長
解決方案單位對應(yīng):GB -> G, g;MB -> M, m;KB -> K, k
使用 -Xmx 增加堆大小 修復(fù)應(yīng)用程序中的內(nèi)存泄漏
2. GC 開銷超過限制發(fā)生頻率:5顆星造成原因Java 進(jìn)程98%的時間在進(jìn)行垃圾回收,恢復(fù)了不到2%的堆空間,最后連續(xù)5個(編譯時常量)垃圾回收一直如此。
解決方案使用 -Xmx 增加堆大小 使用 -XX:-UseGCOverheadLimit 取消 GC 開銷限制 修復(fù)應(yīng)用程序中的內(nèi)存泄漏
3. 請求的數(shù)組大小超過虛擬機(jī)限制發(fā)生頻率:2顆星造成原因應(yīng)用程序試圖分配一個超過堆大小的數(shù)組
解決方案使用 -Xmx 增加堆大小 修復(fù)應(yīng)用程序中分配巨大數(shù)組的 bug
4. Perm gen 空間發(fā)生頻率:3顆星造成原因Perm gen 空間包含: 當(dāng) Perm gen 空間用盡時,將拋出異常。 解決方案使用 -XX: MaxPermSize 增加 Permgen 大小 不重啟應(yīng)用部署應(yīng)用程序可能會導(dǎo)致此問題。重啟 JVM 解決
5. Metaspace發(fā)生頻率:3顆星造成原因從 Java 8 開始 Perm gen 改成了 Metaspace,在本機(jī)內(nèi)存中分配 class 元數(shù)據(jù)(稱為 metaspace)。如果 metaspace 耗盡,則拋出異常
解決方案通過命令行設(shè)置 -XX: MaxMetaSpaceSize 增加 metaspace 大小 取消 -XX: maxmetsspacedize 減小 Java 堆大小,為 MetaSpace 提供更多的可用空間 為服務(wù)器分配更多的內(nèi)存 可能是應(yīng)用程序 bug,修復(fù) bug
6. 無法新建本機(jī)線程發(fā)生頻率:5顆星造成原因內(nèi)存不足,無法創(chuàng)建新線程。由于線程在本機(jī)內(nèi)存中創(chuàng)建,報告這個錯誤表明本機(jī)內(nèi)存空間不足
解決方案為機(jī)器分配更多的內(nèi)存 減少 Java 堆空間 修復(fù)應(yīng)用程序中的線程泄漏。 增加操作系統(tǒng)級別的限制 使用 -Xss 減小線程堆棧大小
7. 殺死進(jìn)程或子進(jìn)程發(fā)生頻率:1顆星造成原因內(nèi)核任務(wù):內(nèi)存不足結(jié)束器,在可用內(nèi)存極低的情況下會殺死進(jìn)程
解決方案將進(jìn)程遷移到不同的機(jī)器上 給機(jī)器增加更多內(nèi)存
與其他 OOM 錯誤不同,這是由操作系統(tǒng)而非 JVM 觸發(fā)的。 8. 發(fā)生 stack_trace_with_native_method發(fā)生頻率:1顆星造成原因本機(jī)方法(native method)分配失敗 打印的堆棧跟蹤信息,最頂層的幀是本機(jī)方法
解決方案使用操作系統(tǒng)本地工具進(jìn)行診斷
|