Jvm知識學習(八)-Java堆分析

一,內存溢出(OOM)的原因
1,JVM內存區間可以簡單的分爲:堆,永久區,線程棧,直接內存
2,內存溢出的幾種:
(1)堆內存溢出:


(2)永久區內存溢出:

(3)Java棧內存溢出:


(4)直接內存溢出:



備註說明:直接內存需要GC回收,但是直接內存無法引起GC。直接內存使用滿時,無法觸發GC。
如果堆空間很富餘,無法觸發GC,直接內存可能就會溢出。如果堆空間觸發GC,直接內存可以回收

二,MAT使用基礎



支配樹的說明:

分析堆總體信息,查看對象消耗內存的比例:
顯示入引用(incoming)和出引用(outgoing):

淺堆(Shallow Heap)與深堆(Retained Heap):


淺堆(Shallow Heap)與深堆(Retained Heap)示例說明:
(1)運行代碼如下所示

(2)分析圖:

(3)堆信息:

分析:可以看到,所有的Point實例淺堆和深堆的大小都是16字節。而dLine對象,淺堆爲16字節,深堆也是16字節,這是因爲dLine對象內的兩個點f和g沒有被設置爲null,因此,即使dLine被回收,f和g也不會被釋放。對象cLine內的引用對象d和e由於僅在cLine內還存在引用,因此只要cLine被釋放,d和e必然也作爲垃圾被回收,即d和e在cLine的保留集內,因此cLine的深堆爲16*2+16=48字節。
對於aLine和bLine對象,由於兩者均持有對方的一個點,因此,當aLine被回收時,公共點a在bLine中依然有引用存在,故不會被回收,點a不在aLine對象的保留集中,因此aLine的深堆大小爲16+16=32字節。對象bLine與aLine完全一致。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章