天天看點

了解Heap Profling名詞-Shallow和Retained Sizes

所有包含HeapProfling功能的工具(MAT,Yourkit,JProfiler,TPTP等)都會使用到兩個名詞,一個是ShallowSize,另一個是RetainedSize.

這是兩個在平時不太常見的名詞,本文會對這兩個名詞做一個詳細的解釋。

ShallowSize

對象自身占用的記憶體大小,不包括它引用的對象。

針對非數組類型的對象,它的大小就是對象與它所有的成員變量大小的總和。當然這裡面還會包括一些java語言特性的資料存儲單元。

針對數組類型的對象,它的大小是數組元素對象的大小總和。

RetainedSize

RetainedSize=目前對象大小+目前對象可直接或間接引用到的對象的大小總和。(間接引用的含義:A->B->C,C就是間接引用)

換句話說,RetainedSize就是目前對象被GC後,從Heap上總共能釋放掉的記憶體。

不過,釋放的時候還要排除被GCRoots直接或間接引用的對象。他們暫時不會被被當做Garbage。

GCRoots直接引用了A和B兩個對象。

A對象的RetainedSize=A對象的ShallowSize

B對象的RetainedSize=B對象的ShallowSize+C對象的ShallowSize

這裡不包括D對象,因為D對象被GCRoots直接引用。

如果GCRoots不引用D對象呢?