垃圾回收的算法與實(shí)現(xiàn)讀書筆記—學(xué)習(xí)GC之前

對(duì)象

在GC的世界中努潘,對(duì)象表示的是“通過應(yīng)用程序利用的數(shù)據(jù)的集合”懂牧。對(duì)象配置在內(nèi)存空間里。GC根據(jù)情況將配置好的對(duì)象進(jìn)行移動(dòng)或銷毀操作皱坛。因此编曼,對(duì)象是GC的基本單位。

一般來說剩辟,對(duì)象由頭( header)和域( field)構(gòu)成掐场。在 對(duì)象 內(nèi)部,頭之后存在1個(gè)及1個(gè)以上的域抹沪。


頭和域
  • 頭:對(duì)象中保存對(duì)象本身信息的部分稱為“頭”刻肄。頭主要含有以下信息:對(duì)象的大小和對(duì)象的種類。此外融欧,頭中事先存有運(yùn)行 GC所需的信息敏弃,根據(jù)GC算法的不同,信息也不同噪馏;
  • 域:對(duì)象使用者在對(duì)象中可訪問的部分稱為“域”麦到。對(duì)象使用者會(huì)引用或替換對(duì)象的域值绿饵,而基本上無法直接更改頭的信息。域中的數(shù)據(jù)類型大致分為指針和非指針兩種瓶颠;

mutator(應(yīng)用程序)實(shí)際進(jìn)行的操作包括生成對(duì)象和更新指針兩種拟赊。mutator在進(jìn)行這些操作時(shí),會(huì)同時(shí)為應(yīng)用程序的用戶進(jìn)行一些處理粹淋。隨著這些處理的逐步推進(jìn)吸祟,對(duì)象間的引用關(guān)系也會(huì)“ 改變”。伴隨這些變化會(huì)產(chǎn)生垃圾桃移,而負(fù)責(zé)回收這些垃圾的機(jī)制就是GC屋匕。

在開始執(zhí)行mutator前,GC要分配用于堆的內(nèi)存空間借杰。一旦開始執(zhí)行 mutator过吻,程序就會(huì)按照mutator的要求在堆中存放對(duì)象。等到堆被對(duì)象占滿 后蔗衡,GC就會(huì)啟動(dòng)纤虽,從而分配可用空間。如果不能分配足夠的可用空間绞惦,一般情況下就要擴(kuò)大堆逼纸。

將分配到內(nèi)存空間中的對(duì)象中那些能通過mutator引用的對(duì)象稱為“活動(dòng)對(duì)象”。反過來翩隧,把分配到堆中那些不能通過程序引用的對(duì)象稱為“ 非活動(dòng)對(duì)象”樊展。非活動(dòng)對(duì)象就稱為“垃圾”呻纹。

分塊( chunk)指的是為利用對(duì)象而事先準(zhǔn)備出來的空間堆生。初始狀態(tài)下,堆被 一個(gè)大的分塊所占據(jù)雷酪。然后淑仆,程序會(huì)根據(jù)mutator的要求把這個(gè)分塊分割成合適的大小,作為活動(dòng)對(duì)象使用哥力≌岬。活動(dòng)對(duì)象不久后會(huì)轉(zhuǎn)化為垃圾被回收。此時(shí)吩跋,這部分被回收的內(nèi)存空間再次成為分塊寞射,為下次被利用做準(zhǔn)備。也就是說锌钮,內(nèi)存里的各個(gè)區(qū)塊都重復(fù)著分塊→活動(dòng)對(duì)象→垃圾(非活動(dòng)對(duì)象)→分塊→ …… 這樣的過程桥温。

根是指向?qū)ο蟮闹羔樀摹?起點(diǎn)” 部分。

1 $ obj = Object.new 
2 $ obj.field1 = Object.new

其中$obj是全局變量梁丘,執(zhí)行完侵浸,全局變量空間及堆如下圖:


GC把上述這樣可以直接或間接從全局變量空間中引用的對(duì)象視為活動(dòng)對(duì)象旺韭。

與全局變量空間相同,我們也可以通過mutator直接引用調(diào)用棧(call stack)和寄存器掏觉。也就是說区端,調(diào)用棧、寄存器以及全局變量空間都是根澳腹。

評(píng)價(jià)標(biāo)準(zhǔn)

評(píng)價(jià)GC算法的性能時(shí)织盼,采用以下4個(gè)標(biāo)準(zhǔn):

  • 吞吐量
    吞吐量( throughput)指的是“在單位時(shí)間內(nèi)的處理能力”。如下圖酱塔,整個(gè)執(zhí)行過程中悔政,GC啟動(dòng)了三次,總花費(fèi)時(shí)間為(A+B+C)延旧,堆大小為HEAP_SIZE谋国,即在大小為HEAP_SIZE的堆上進(jìn)行內(nèi)存管理,需要花費(fèi)的時(shí)長(zhǎng)為(A+B+C)迁沫。所以芦瘾,GC的吞吐量HEAP_SIZE/(A+B+C)。


    吞吐量
  • 最大暫停時(shí)間
    最大暫停時(shí)間指的是“因執(zhí)行GC而暫停執(zhí)行mutator的最長(zhǎng)時(shí)間”集畅。即上圖中的B近弟。不管嘗試哪種GC算法,都會(huì)發(fā)現(xiàn)較大的吞吐量和較短的最大暫停時(shí)間不可兼得挺智。

  • 堆使用效率
    左右堆使用效率的因素有兩個(gè):
    頭的大械挥洹:毋庸置疑,頭越小越好赦颇。因此為了執(zhí)行GC二鳄,需要把在頭中堆放的信息控制在最小限度。
    堆的用法:根據(jù)堆的用法媒怯,堆使用效率也會(huì)出現(xiàn)巨大的差異订讼。

    堆使用效率和吞吐量,以及最大暫停時(shí)間不可兼得扇苞∑鄣睿可用的堆越大,GC運(yùn)行越快鳖敷;相反脖苏,越想有效地利用有限的堆,GC花費(fèi)的時(shí)間就越長(zhǎng)定踱。

  • 訪問的局部性
    PC上有4種存儲(chǔ)器棍潘,分別是寄存器、緩存、內(nèi)存蜒谤、輔助存儲(chǔ)器山宾。


    存儲(chǔ)器

    一般把所有的數(shù)據(jù)都放在內(nèi)存 里,當(dāng)CPU訪問數(shù)據(jù) 時(shí)鳍徽,僅把要使用的數(shù)據(jù)從內(nèi)存讀取到緩存资锰。與此同時(shí),還將它附近的所有數(shù)據(jù)都讀取到緩存中阶祭,從而壓縮讀取數(shù)據(jù)所需要的時(shí)間绷杜。

    具有引用關(guān)系的對(duì)象之間通常很可能存在連續(xù)訪問的情況。這在多數(shù)程序中都很常見濒募,稱為“訪問的局部性”鞭盟。把具有引用關(guān)系的對(duì)象安排在堆中較近的位置,就能提高在緩存中讀取到想利用的數(shù)據(jù)的概率瑰剃,令mutator高速運(yùn)行齿诉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晌姚,隨后出現(xiàn)的幾起案子粤剧,更是在濱河造成了極大的恐慌,老刑警劉巖挥唠,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵恋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宝磨,警方通過查閱死者的電腦和手機(jī)弧关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唤锉,“玉大人世囊,你說我怎么就攤上這事‰缃簦” “怎么了茸习?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵畜隶,是天一觀的道長(zhǎng)壁肋。 經(jīng)常有香客問我,道長(zhǎng)籽慢,這世上最難降的妖魔是什么浸遗? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮箱亿,結(jié)果婚禮上跛锌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好髓帽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布菠赚。 她就那樣靜靜地躺著,像睡著了一般郑藏。 火紅的嫁衣襯著肌膚如雪衡查。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天必盖,我揣著相機(jī)與錄音拌牲,去河邊找鬼。 笑死歌粥,一個(gè)胖子當(dāng)著我的面吹牛塌忽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播失驶,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼土居,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嬉探?” 一聲冷哼從身側(cè)響起装盯,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甲馋,沒想到半個(gè)月后埂奈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡定躏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年账磺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痊远。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垮抗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碧聪,到底是詐尸還是另有隱情冒版,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布逞姿,位于F島的核電站辞嗡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滞造。R本人自食惡果不足惜续室,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谒养。 院中可真熱鬧挺狰,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞳购,卻和暖如春沉唠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苛败。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工满葛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罢屈。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓嘀韧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親缠捌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锄贷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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