一文讓你理解什么是shallow heap及retained heap

前言

快速定位性能故障并非一朝一夕之功,需要我們對很多概念有很深刻的理解担汤,在前文中,我們介紹了heap dump的相關概念和其獲取方式选浑,今天我們一起來了解一下什么是:
Shallow 和 retained sizes杖玲。

GC ROOT是什么顿仇?

在java語言中,都是通過可達性分析來判定對象是否存活的摆马。此算法的基本思路是:通過一系列的稱為“GC Roots”的對象作為起點臼闻,從這些節(jié)點向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain)囤采,當一個對象到GC Roots沒有任何引用鏈相連述呐,則證明此對象是不可達的。

file

在上圖右側中蕉毯,我們可以看到乓搬,對象5/6/7雖然有依賴關聯(lián)思犁,但是他們到GC ROOT根節(jié)點是不可達的,所以這三個節(jié)點對象會被判定為是可回收的进肯。

GC ROOT的定義比較特別抒倚,他們不屬歸屬于對象圖中,對象也不能反向的依賴他們坷澡,這也確保了不會出現(xiàn)循環(huán)引用的問題托呕。因此也容易得出,只有引用類型的變量才被認為是Roots频敛,值類型的變量永遠不被認為是Roots项郊。

在Java中,可作為GC Roots的對象包括以下幾種:

虛擬機棧(棧幀中的局部變量表斟赚,Local Variable Table)中引用的對象着降。
方法區(qū)中類靜態(tài)屬性引用的對象。
方法區(qū)中常量引用的對象拗军。
本地方法棧中JNI(即一般說的Native方法)引用的對象任洞。

看到這里你可能要問,選擇這些對象的依據(jù)是什么呢发侵?

首先交掏,GCROOT的目標對象是要以當前還在存活的對象集合,因此必須要選取確定存活的引用類型對象刃鳄,GC管理的區(qū)域是java的堆盅弛,虛擬機棧、方法區(qū)和本地方法棧不被GC所管理叔锐,因此選用這些區(qū)域內引用的對象作為GC Roots挪鹏,是不會被GC回收的。

其中虛擬機棧和本地方法棧都是線程私有的內存區(qū)域愉烙,只要線程沒有終止讨盒,就能確保它們中引用的對象的存活。而方法區(qū)中類靜態(tài)屬性引用的對象是顯然存活的步责。常量引用的對象在當前可能存活返顺,因此,也可能是GC roots的一部分勺择。

下圖是使用MAT工具中的 “path to GC roots ”功能分析出來的引用鏈创南。


file

它標識從當前對象到GC roots的路徑,這個路徑解釋了為什么當前對象還能存活省核,對分析內存泄露很有幫助稿辙。

在查詢到GC root的路徑時,默認是包含所有引用的气忠,從GC角度說邻储,一個對象無法被GC赋咽,一定是因為有強引用存在,其它引用類型在GC需要的情況下都是可以被GC掉的吨娜,所以這里我使用 exclude all phantom/weak/soft etc. references 只查看GC路徑上的強引用脓匿。

shallow heap和retained heap

直譯過來是淺層堆和保留堆的意思。先說一說其基本的概念宦赠。

shallow heap

表示對象本身占用內存的大小陪毡,也就是對象頭加成員變量(不是成員變量的值)的總和。

如一個引用占用32或64bit勾扭,一個integer占4bytes毡琉,Long占8bytes等。

如簡單的一個類里面只有一個成員變量int i妙色,那么這個類的shallow size是12字節(jié)桅滋,因為對象頭是8字節(jié),成員變量int是4字節(jié)身辨。

常規(guī)對象(非數(shù)組)的Shallow size有其成員變量的數(shù)量和類型決定丐谋,數(shù)組的shallow size有數(shù)組元素的類型(對象類型、基本類型)和數(shù)組長度決定煌珊。

對象的值是分配給存儲對象本身的內存量号俐,不考慮所引用的對象。常規(guī)(非數(shù)組)對象的淺大小取決于其字段的數(shù)量和類型怪瓶。數(shù)組的淺尺寸取決于數(shù)組的長度及其元素(對象萧落、基本類型)的類型践美。一組對象的淺尺寸表示該集合中所有對象的淺尺寸之和洗贰。

retained heap

如果一個對象被釋放掉,那會因為該對象的釋放而減少引用進而被釋放的所有的對象(包括被遞歸釋放的)所占用的heap大小陨倡,即對象被垃圾回收器回收后能被GC從內存中移除的所有對象之和敛滋。相對于shallow heap,Retained heap可以更精確的反映一個對象實際占用的大行烁铩(若該對象釋放绎晃,retained heap都可以被釋放)。

實際案例分析

file

正如上圖所示:
在這兩張圖中杂曲,我們畫出了GC ROOT到所有對象引用鏈。在這里我們著重分析一下Retained size。

對于obj1這個對象:
GC ROOT指向它封寞,并且它依賴于obj2刀崖、obj3、obj4棚饵,但是由于obj3同樣也被GC ROOT所指煤裙。
所以:

分析obj1:

對于圖1掩完,retained size包括:obj1+obj2+obj4

對于圖2,retained size包括:obj1+obj2+obj3+obj4

分析obj2:

對于圖1:retained size包括:obj2+obj4

對于圖2:retained size包括:obj2+obj3+obj4

總結

本篇文章圍繞內存分析中的Shallow 和Retained heap擴展了解了幾個知識點如下:

  • gc root的定義和概念的了解硼砰。
  • 對象可達性分析和選擇gc root的依據(jù)且蓬。
  • 針對單個對象使用“path to GC roots”查看其引用樹。
  • shallow heap和retained heap的基本概念题翰。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末恶阴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豹障,更是在濱河造成了極大的恐慌存淫,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沼填,死亡現(xiàn)場離奇詭異桅咆,居然都是意外死亡,警方通過查閱死者的電腦和手機坞笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門岩饼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人薛夜,你說我怎么就攤上這事籍茧。” “怎么了梯澜?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵寞冯,是天一觀的道長。 經(jīng)常有香客問我晚伙,道長吮龄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任咆疗,我火速辦了婚禮漓帚,結果婚禮上,老公的妹妹穿的比我還像新娘午磁。我一直安慰自己尝抖,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布迅皇。 她就那樣靜靜地躺著昧辽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪登颓。 梳的紋絲不亂的頭發(fā)上搅荞,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼取具。 笑死脖隶,一個胖子當著我的面吹牛,可吹牛的內容都是我干的暇检。 我是一名探鬼主播产阱,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼块仆!你這毒婦竟也來了构蹬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤悔据,失蹤者是張志新(化名)和其女友劉穎庄敛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體科汗,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡藻烤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了头滔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怖亭。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坤检,靈堂內的尸體忽然破棺而出兴猩,到底是詐尸還是另有隱情,我是刑警寧澤早歇,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布倾芝,位于F島的核電站,受9級特大地震影響箭跳,放射性物質發(fā)生泄漏晨另。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一衅码、第九天 我趴在偏房一處隱蔽的房頂上張望拯刁。 院中可真熱鬧,春花似錦逝段、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亿驾,卻和暖如春嘹黔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工儡蔓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留郭蕉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓喂江,卻偏偏與公主長得像召锈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子获询,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容