所有包含heap profling功能的工具(mat, yourkit, jprofiler, tptp等)都會使用到兩個名詞,一個是shallow size,另一個是 retained size.
這是兩個在平時不太常見的名詞,本文會對這兩個名詞做一個詳細的解釋。
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