Eclipse MAT: Shallow Heap Vs Retained Heap 你理解的對嗎?

Eclipse MAT: Shallow Heap Vs Retained Heap 你理解的對嗎抄伍?

作者:Ram Lakshmanan艘刚,原文:Eclipse MAT: Shallow Heap Vs. Retained Heap

有沒有想過 Shallow 和 Retained heap 之間的區(qū)別?

Eclipse MAT(內(nèi)存分析器工具)是分析 JVM 堆 Dump 文件的強大工具截珍。當嘗試分析內(nèi)存相關的問題時攀甚,它非常方便。在 Eclipse MAT 中岗喉,報告了兩種類型的對象大星锒取:

  1. Shallow Heap
  2. Retained Heap

在本文中,我們主要討論它們之間的區(qū)別钱床,并探討它們的計算方式荚斯。

通過示例理解知識會更容易,咱們來看看這樣一個例子查牌。例如事期,假設你的應用程序具有這樣的對象模型,如圖 1 所示:

內(nèi)存中的對象

圖1:內(nèi)存中的對象

  • 對象 A 持有對象 B 和 C 的引用僧免。
  • 對象 B 持有對象 D 和 E 的引用。
  • 對象 C 持有對象 F 和 G 的引用捏浊。

另外懂衩,我們假設每個對象占用 10 個字節(jié)的內(nèi)存。在這種場景下金踪,我們來開始分析吧浊洞。

Shallow Heap 大小

請記住:對象的 Shallow heap 是其自身在內(nèi)存中的大小胡岔。由于在我們的示例中法希,每個對象占用大約 10 個字節(jié),因此每個對象的 Shallow heap 大小為 10 個字節(jié)靶瘸。很簡單苫亦。

B 的 Retained Heap 大小

從圖 1 中,您可以注意到對象 B 持有對象 D 和 E 的引用怨咪。因此屋剑,如果對象 B 是從內(nèi)存中被垃圾回收,則將不再有對對象 D 和 E 的引用诗眨。這意味著此時 D 和 E 也可以被垃圾收集唉匾。Retained heap 指的就是在垃圾回收特定對象時將釋放的內(nèi)存量。因此匠楚,B 的保留堆大小為:
= B 的 shallow heap 大小 + D 的 shallow heap 大小 + E 的 shallow heap 大小
= 10 bytes + 10 bytes + 10 bytes
= 30 bytes

因此巍膘,B 對象的 Retained heap 大小為 30 字節(jié)

C 的 Retained Heap 大小

對象 C 擁有對象 F 和 G 的引用厂财。如果對象 C 是從內(nèi)存中垃圾回收的,將不再持有對對象 F 和 G 的引用峡懈。這意味著此時 F 和 G 也可以被垃圾回收璃饱。 因此,C 的 Retained Heap 大小為:
= C 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小
= 10 bytes + 10 bytes + 10 bytes
= 30 bytes

因此逮诲,C 對象的 Retained heap 大小為 30 字節(jié)

A 的 Retained Heap 大小

對象 A 持有對象 B 和 C 的引用帜平,而對象 B 和 C 又持有對對象 D、E 以及 F梅鹦、G 的引用裆甩。因此,如果對象 A 是從內(nèi)存中垃圾回收的齐唆,則將不再有對 B嗤栓、C、D箍邮、E茉帅、F 和 G 對象的引用《П祝基于此理解堪澎,我們來計算下 A 的 Retained Heap 大小。
A 的 Retained Heap 大小為:
= A 的 shallow heap 大小 + B 的 shallow heap 大小 + C 的 shallow heap 大小 + D 的 shallow heap 大小 + E 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小
= 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes + 10 bytes
= 70 bytes

最后我們可以得出味滞,A 的 Retained heap 大小是 70 字節(jié)樱蛤。

D、E剑鞍、F昨凡、G 的 Retained Heap 大小

D 的 Retained heap 大小與其 Shallow heap 大小相同,就是 10 個字節(jié)蚁署,因為 D 不持有對任何其他對象的引用便脊。因此,如果 D 獲得了垃圾回收光戈,則不會從內(nèi)存中刪除其他的任何對象哪痰。同理,E久妆、F 和 G 的 Retained heap 大小也只有 10 個字節(jié)妒御。


對象的 Shallow and Retained Heap 大小

圖 2:對象的 Shallow and Retained Heap 大小

咱們再來點更有趣的吧

現(xiàn)在,讓我們的來點更加有趣的吧镇饺,以便讓你對 Shallow heap 和 Retained heap 有更加透徹的了解乎莉。在下面的示例中,讓對象 H 開始持有對 B 的引用。注意對象 B 已經(jīng)被對象 A 引用了⊥锟校現(xiàn)在哼鬓,兩個家伙 A 和 H 都持有對象 B 的引用。在這種情況下边灭,讓我們研究 Retained heap 計算將會發(fā)生什么變化异希。


新增對 B 的引用

圖 3:新增對 B 的引用

在這種情況下,對象 A 的 Retained heap 大小將從之前的 70 減小到 40 個字節(jié)绒瘦。是不是很吃驚称簿? 如果對象 A 被垃圾回收了,則將僅會影響 C惰帽、F 和 G 對象的引用憨降。因此,僅對象 C该酗、F 和 G 將被垃圾回收授药。另一方面,由于 H 持有對 B 的活動引用呜魄,因此對象 B悔叽、D 和 E 將繼續(xù)存在于內(nèi)存中。因此爵嗅,即使 A 被垃圾回收娇澎,B、D 和 E 也不會從內(nèi)存中刪除睹晒。因此趟庄,A 的 Retained heap 大小為:
= A 的 shallow heap 大小 + C 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小
= 10 bytes + 10 bytes + 10 bytes + 10 bytes
= 40 bytes.

A 的總 Retained heap 大小將變?yōu)?40 個字節(jié)。所有其他對象 Retained heap 大小將保持不變册招,因為它們的引用沒有變化岔激。

希望本文能夠讓你了解 Eclipse MAT 中的 Shallow heap 大小 和 Retained heap 大小計算方式勒极。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是掰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辱匿,更是在濱河造成了極大的恐慌键痛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾七,死亡現(xiàn)場離奇詭異絮短,居然都是意外死亡,警方通過查閱死者的電腦和手機昨忆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門丁频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事席里∈辶祝” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵奖磁,是天一觀的道長改基。 經(jīng)常有香客問我,道長咖为,這世上最難降的妖魔是什么秕狰? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮躁染,結果婚禮上鸣哀,老公的妹妹穿的比我還像新娘。我一直安慰自己褐啡,他們只是感情好诺舔,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著备畦,像睡著了一般低飒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂盐,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天褥赊,我揣著相機與錄音,去河邊找鬼莉恼。 笑死拌喉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的俐银。 我是一名探鬼主播尿背,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捶惜!你這毒婦竟也來了田藐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤吱七,失蹤者是張志新(化名)和其女友劉穎汽久,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踊餐,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡景醇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吝岭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片三痰。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吧寺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出散劫,到底是詐尸還是另有隱情撮执,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布舷丹,位于F島的核電站抒钱,受9級特大地震影響,放射性物質發(fā)生泄漏颜凯。R本人自食惡果不足惜谋币,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望症概。 院中可真熱鬧蕾额,春花似錦、人聲如沸彼城。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽募壕。三九已至调炬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舱馅,已是汗流浹背缰泡。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留代嗤,地道東北人棘钞。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像干毅,于是被迫代替她去往敵國和親宜猜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容