理解VisualVM中的保留大小(Retained Size)

Shallow Size and Retained Size

Shallow Size and Retained Size 的含義都是指的實(shí)例對(duì)象,不是類本身。

下面將用 sampleClass 表示類Sample的一個(gè)實(shí)例(instance)

Shallow Size 含義

Shallow Size 就是對(duì)象本身所占用的大小,不包括其引用的對(duì)象。

舉個(gè)例子:

public class SampleClass {
    // age 屬于 Shallow Size
    private int age = 1;
    // String 類型引用本身 name 屬于 Shallow Size,
    // 被引用對(duì)象 "SOME_STRING" 不屬于 Sample 的實(shí)例Shallow Size
    private String name = SOME_STRING;
    // 數(shù)組所有內(nèi)容都屬于 Shallow Size
    private int[] ids = {1, 2, 3};
}

Retained Size 含義

針對(duì)可達(dá)對(duì)象

可達(dá)對(duì)象就是說(shuō),從 GC roots 開(kāi)始搜索,能夠到達(dá)的對(duì)象,也就是說(shuō)下一次GC不會(huì)被清理的對(duì)象,采用下面的計(jì)算方法來(lái)得到 Retained Size 對(duì)象

Retained Size的含義相對(duì)于Shallow Size 不太好理解。依然是上面的例子,在不同的情況下,sampleClass 的Retained Size 并不相同。下面引用StackOverFlow上的一個(gè)回答來(lái)解釋這個(gè)問(wèn)題。

Retained size of an object is its shallow size plus the shallow sizes of the objects that are accessible, directly or indirectly, only from this object. In other words, the retained size represents the amount of memory that will be freed by the garbage collector when this object is collected.

圖一

上圖應(yīng)該比較容易理解,看起來(lái)每個(gè)對(duì)象的Retained Size 都符合公式( Retained Size = Shallow Size + 直接子對(duì)象的 Retained Size),并沒(méi)有什么問(wèn)題,然后我們看另外一種引用關(guān)系中,Obj1 的Retained Size 就會(huì)發(fā)生變化。

圖二

第二種圖中,你會(huì)發(fā)現(xiàn)Obj2的Retained Size 不再符合我們剛剛總結(jié)出來(lái)的公式,這是因?yàn)镺bj2的直接子對(duì)象Obj5還被Obj6所引用,造成的結(jié)果就是,如果Obj2被回收,Obj5并不會(huì)被回收,所以 Obj2 的Retained Size就不應(yīng)該包括 Obj5 的Retained Size. 雖然 Obj2 的 Retained Size 發(fā)生了變化,但是 Obj1 的 Retained Size 并沒(méi)有發(fā)生變化。

針對(duì)不可達(dá)對(duì)象

指的是下一次 GC 會(huì)被清理的對(duì)象,也就是說(shuō)沒(méi)有其他對(duì)象引用自己的對(duì)象。

如果你嘗試使用 VisualVM 分析dump文件的時(shí)候,你會(huì)發(fā)現(xiàn)有些對(duì)象的 Retained Size 居然是0,這個(gè)0就推翻了上面那種分析方法的的結(jié)論,覺(jué)得無(wú)論什么樣的對(duì)象肯定是會(huì)有 Shallow Size 的,不可能為0。

通過(guò)分析最后可以這樣理解:針對(duì)不可達(dá)對(duì)象,也就是可以完全被清除的對(duì)象,Retained Size 都是0

附錄

理解誤區(qū)

好多人是簡(jiǎn)單的將保留大小描述為,該對(duì)象本身和其直接引用或者間接引用的對(duì)象的大小的總和。這種理解是片面的,就像上面例子中的 Obj2 一樣,如果按照這種理解就會(huì)得到錯(cuò)誤的結(jié)論。

如何在 VisualVM 中計(jì)算保留大?。≧etained Size)

image

一些 Retained Size 為 0 的例子

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容