可能原因:
(1)內(nèi)存確實分配過小毕骡,內(nèi)存確實不夠用削饵;
(2)某一個對象被頻繁申請,卻沒有釋放挺峡,內(nèi)存不斷泄漏葵孤,導(dǎo)致內(nèi)存耗盡;
(3)某一個資源被頻繁申請橱赠,系統(tǒng)資源耗盡尤仍,例如:不斷創(chuàng)建線程,不斷發(fā)起網(wǎng)絡(luò)連接狭姨;
排查方法:
一宰啦、確認(rèn)是不是內(nèi)存本身就分配過小方法:jmap?-heap + PID
二苏遥、找到最耗內(nèi)存的對象方法:jmap?-histo:live PID | more
會打印(1)實例數(shù)赡模;(2)所占內(nèi)存大刑锾俊;(3)類名漓柑;
三教硫、確認(rèn)是否是資源耗盡工具:(1)pstree(2)netstat
OOM排查? 詳細(xì)帖子
具體操作:
1、先查看應(yīng)用進(jìn)程號pid: ps ?-ef | grep ?應(yīng)用名(或者jps命令也可以看到PID)
2辆布、查看pid垃圾回收情況:??jstat ?-gc ?pid ?5000(時間間隔)
3瞬矩、開啟OOM快照:
-XX:+HeapDumpOnOutOfMemoryError(開啟堆快照)
-XX:HeapDumpPath=C:/m.hprof(保存文件到哪個目錄)
4、dump 查看方法棧信息:
jstack -l? pid? >? /home/test/jstack.txt
5锋玲、dump 查看JVM內(nèi)存分配以及使用情況
jmap? -heap? pid? >? /home/test/jmapHeap.txt
6景用、dump jvm二進(jìn)制的內(nèi)存詳細(xì)使用情況 (效果同在Tomcat的catalina.sh中添加 set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/test//oom.hprof? 此文件需要借用內(nèi)存分析工具如:Memory Analyzer (MAT)來分析)
jmap -dump:format=b,file=/home/test/oom.hprof? pid
OOM一般有以下兩種情況:
1、年老代堆空間被占滿
異常:java.lang.OutOfMemoryError:java? heap space
說明:這是最典型的內(nèi)存泄漏方式惭蹂,簡單說就是所有堆空間都被無法回收的垃圾對象占滿伞插,虛擬機(jī)再也無法分配新空間
解決方案:這種方式解決起來比較簡單,一般就是根據(jù)垃圾回收前后的情況對比盾碗,同時根據(jù)對象引用情況(常見的集合對象引用)分析媚污,基本都可以找到泄漏點(diǎn)。
2置尔、持久代被占滿
異常:java.lang.OutOfMemoryError:PermGen space
說明:Perm 空間被占滿杠步,無法為新的 class 分配存儲空間而引發(fā)的異常氢伟。這個異常以前是沒有的榜轿,但是在 java 大量使用反射的今天這個異常就比較常見了。主要原因是大量動態(tài)反射生成的類不斷被加載朵锣,最終導(dǎo)致 Perm 區(qū)被占滿谬盐。更可怕的是,不同的 classLoader 即便使用相同的類诚些,但是都會對其進(jìn)行加載飞傀,相當(dāng)于同一個東西,如果有 N 個classLoader 那么它將會被加載 N 次诬烹。因此砸烦,在某些情況下,這個問題基本視為無解绞吁,當(dāng)然幢痘,存在大量 classLoader 和大量反射類的情況并不多
解決方案:增加持久代內(nèi)存 ,例如:-XX:MaxPermSize=16M