最近在研究內存洩漏的問題,在使用MAT工具中發現了Shallow heap & Retained heap,不懂。
然後在網上找了一些資料。
Shallow Size
對象自身占用的內存大小,不包括它引用的對象。
針對非數組類型的對象,它的大小就是對象與它所有的成員變量大小的總和。當然這裡面還會包括一些java語言特性的數據存儲單元。
針對數組類型的對象,它的大小是數組元素對象的大小總和。
Retained Size
Retained Size=當前對象大小+當前對象可直接或間接引用到的對象的大小總和。(間接引用的含義:A->B->C, C就是間接引用)
換句話說,Retained Size就是當前對象被GC後,從Heap上總共能釋放掉的內存。
不過,釋放的時候還要排除被GC Roots直接或間接引用的對象。他們暫時不會被被當做Garbage。
看圖理解Retained Size
上圖中,GC Roots直接引用了A和B兩個對象。
A對象的Retained Size=A對象的Shallow Size
B對象的Retained Size=B對象的Shallow Size + C對象的Shallow Size
這裡不包括D對象,因為D對象被GC Roots直接引用。
如果GC Roots不引用D對象呢?
此時,
B對象的Retained Size=B對象的Shallow Size + C對象的Shallow Size + D對象的Shallow Size