Shallow Size和Retained Size詳解

Shallow Size和Retained Size詳解

參考文章
How much memory do I need (part 1) – What is retained heap?

How much memory do I need (part 2) – What is shallow heap?

在Android開(kāi)發(fā)中, 想要進(jìn)行內(nèi)存分析, 總會(huì)看見(jiàn)Shallow SizeRetained Size, 這邊文章主要解釋

  1. 它們分別表示什么含義
  2. 它們是如何計(jì)算出來(lái)的

Java garbage collection (GC)

我們先了解GC的一些基本知識(shí)

  1. 程序中存在一些實(shí)例, 稱作GC root, 它們不會(huì)被GC回收, 常見(jiàn)的例如靜態(tài)變量, 線程等
  2. GC root直接或間接引用的實(shí)例會(huì)被標(biāo)記為in use, 它們也不會(huì)被GC回收

Shallow Size

Shallow Size是指實(shí)例自身占用的內(nèi)存, 可以理解為保存該'數(shù)據(jù)結(jié)構(gòu)'需要多少內(nèi)存, 注意不包括它引用的其他實(shí)例

計(jì)算公式:

Shallow Size = [類定義] + 父類fields所占空間 + 自身fields所占空間 + [alignment]
  1. 類定義是指, 聲明一個(gè)類本身所需的空間, 固定為8byte, 也就是說(shuō), 一個(gè)不包含任何fields的類的'空類', 也需要占8byte; 另外類定義空間不會(huì)重復(fù)計(jì)算, 就是說(shuō), 即使類繼承其他類, 也只算8byte
  2. 父類fields所占空間, 對(duì)于繼承了其他類的類來(lái)說(shuō), 父類聲明的fields顯然需要占用一定的空間
  3. 自身fields所占空間, 所有fields所占空間之和; fields分基本類型和引用, 基本類型所占空間和系統(tǒng)有關(guān), 例如在32位系統(tǒng)中int=4byte, 64位系統(tǒng)中int=8byte; 引用固定占4byte, 例如String name;這個(gè)變量聲明占4byte.
  4. alignment是指位數(shù)對(duì)齊, 會(huì)讓總空間為8的倍數(shù), 例如某個(gè)A類, 以上3項(xiàng)計(jì)算出來(lái)為15byte, 那么為了對(duì)齊, 讓它是8的倍數(shù), 會(huì)取最接近的值, 所以它的Shallow Size是16byte;

注意, alignment行為和JVM有關(guān), 對(duì)于Android來(lái)說(shuō), 實(shí)測(cè)4.4系統(tǒng)會(huì)有對(duì)齊行為, 但是5.1系統(tǒng)不會(huì)

Shallow Size例子

class X {
    int a;
    byte b;
    Integer c = new Integer();
}

假設(shè)當(dāng)前是在32位系統(tǒng), 對(duì)于類X來(lái)說(shuō), 一個(gè)X實(shí)例的Shallow Size為:

  1. 類定義的8byte
  2. 沒(méi)有繼承其他類, 所以沒(méi)有父類fields
  3. a變量為int型, 4byte; b變量為byte型, 1byte; c變量是引用類型, 和它是否指向具體實(shí)例無(wú)關(guān), 固定占4byte

如果不算alignment,

X的Shallow Size = 8 + 0 + 4 + 1 + 4 = 17byte

如果算上alignment, 那么要補(bǔ)齊為8的倍數(shù), 也就是24byte.

class Y extends X {
    List d;
    Date e;
}

一個(gè)Y實(shí)例的Shallow Size為:

  1. 類定義的8byte
  2. 繼承了X類, X類的所有fields為X類的Shallow Size減去類定義空間8byte, 也就是17byte-8byte=9byte
  3. d, e都是引用類型, 各占4byte

如果不算alignment,

Y的Shallow Size = 8 + 9 + 4 + 4 = 25byte

如果算上alignment, 那么要補(bǔ)齊為8的倍數(shù), 也就是32byte.

Retained Size

實(shí)例A的Retained Size是指, 當(dāng)實(shí)例A被回收時(shí), 可以同時(shí)被回收的實(shí)例的Shallow Size之和

所以進(jìn)行內(nèi)存分析時(shí), 我們應(yīng)該重點(diǎn)關(guān)注Retained Size較大的實(shí)例; 或者可以通過(guò)Retained Size判斷出某A實(shí)例內(nèi)部使用的實(shí)例是否被其他實(shí)例引用.
例如在Android中, 如果某個(gè)Bitmap實(shí)例的Retained Size很小, 證明它內(nèi)部的byte數(shù)組被復(fù)用了, 有另一個(gè)Bitmap實(shí)例指向了同一個(gè)byte數(shù)組.

Retained Size例子

RetainedSize例子.png

圖中A, B, C, D四個(gè)實(shí)例, 為了方便計(jì)算, 我們假設(shè)所有實(shí)例的Shallow Size都是1kb

D實(shí)例

D實(shí)例沒(méi)有引用其他實(shí)例, 所以移除D實(shí)例只會(huì)釋放它自己的空間, 因此

D實(shí)例的Retained Size=Shallow Size=1kb

C實(shí)例

當(dāng)我們移除C實(shí)例, C實(shí)例引用了D實(shí)例, 同時(shí)D實(shí)例沒(méi)有被其他實(shí)例引用, 所以D實(shí)例也會(huì)被GC, 所以

C實(shí)例的Retained Size = C實(shí)例的Shallow Size + D實(shí)例的Shallow Size = 2kb

B實(shí)例

當(dāng)我們移除B實(shí)例, 雖然B實(shí)例引用了C實(shí)例, 但是A實(shí)例也引用了C實(shí)例, 所以移除B實(shí)例不會(huì)讓C實(shí)例被GC, 所以

B實(shí)例的Retained Size=Shallow Size=1kb

A實(shí)例

當(dāng)我們移除A實(shí)例, 顯然A, B, C, D實(shí)例都會(huì)被GC, 所以

A實(shí)例的Retained Size=4kb

總結(jié)

計(jì)算Retained Size的關(guān)鍵在于領(lǐng)會(huì)移除實(shí)例時(shí), 可以同時(shí)被回收的實(shí)例, 重點(diǎn)觀察B實(shí)例的情況

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靡羡,一起剝皮案震驚了整個(gè)濱河市晶府,隨后出現(xiàn)的幾起案子惊奇,更是在濱河造成了極大的恐慌虐唠,老刑警劉巖锐朴,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲤孵,死亡現(xiàn)場(chǎng)離奇詭異个盆,居然都是意外死亡假抄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)踏志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阀捅,“玉大人,你說(shuō)我怎么就攤上這事针余∷潜桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵圆雁,是天一觀的道長(zhǎng)忍级。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伪朽,這世上最難降的妖魔是什么轴咱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮烈涮,結(jié)果婚禮上朴肺,老公的妹妹穿的比我還像新娘。我一直安慰自己坚洽,他們只是感情好戈稿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著讶舰,像睡著了一般鞍盗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绘雁,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天橡疼,我揣著相機(jī)與錄音,去河邊找鬼庐舟。 笑死欣除,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挪略。 我是一名探鬼主播历帚,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼滔岳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挽牢?” 一聲冷哼從身側(cè)響起谱煤,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禽拔,沒(méi)想到半個(gè)月后刘离,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睹栖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年硫惕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野来。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恼除,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曼氛,到底是詐尸還是另有隱情豁辉,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布舀患,位于F島的核電站徽级,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏构舟。R本人自食惡果不足惜灰追,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一堵幽、第九天 我趴在偏房一處隱蔽的房頂上張望狗超。 院中可真熱鬧,春花似錦朴下、人聲如沸努咐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渗稍。三九已至,卻和暖如春团滥,著一層夾襖步出監(jiān)牢的瞬間竿屹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工灸姊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拱燃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓力惯,卻偏偏與公主長(zhǎng)得像碗誉,于是被迫代替她去往敵國(guó)和親召嘶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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