OOM發生的一般原因:
- 資源不夠
可能是內存分配過小,而正常業務卻使用了大量的內存 - 申請的資源太多
某一個對象被頻繁的申請,卻沒有被釋放,內存不斷泄露,最終導致內存耗盡 - 資源耗盡
某一個資源被頻繁的申請,系統在資源耗盡,例如不斷的創建線程,不斷的發起網絡連接
定位方法:
步驟一:確認內存本身分配是不是過小
jmap -heap 進程id
步驟二:找到最耗費內存的對象
jmap -histo:live 進程id | more
步驟三:確認資源是否耗盡
pstree和netstat來查看進程創建的線程數,以及網絡連接數等資源是否被耗盡
內存分析簡單有效的方法是通過內存的dump命令,導出內存棧,但是這個命令會進行full GC一次,導出的文件可以通過MAT VisualVM查看
如下圖顯示
showllow heap表示的是對象本身的大小,retained heap表示的是本身的大小加引用的大小
另外如果要定位代碼正在做什麼事情