GC機(jī)制

判斷對(duì)象是否存活

  • 引用計(jì)數(shù)算法
    定義: 給對(duì)象中添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有地方對(duì)其進(jìn)行引用,計(jì)數(shù)器數(shù)值加1,當(dāng)引用失效時(shí)啊片,計(jì)數(shù)器就減1,任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的袭异。

但是Java虛擬機(jī)中并沒(méi)有使用計(jì)數(shù)算法來(lái)管理內(nèi)存,因?yàn)樗茈y解決對(duì)象之間相互循環(huán)引用的問(wèn)題炬藤。如下代碼中這種相互引用御铃,導(dǎo)致引用計(jì)數(shù)一直不為0

public class  RefrenceGC(){
     public Object instance = null;
     public static void testGC(){
          RefrenceGC objA = new RefrenceGC();
          RefrenceGC objB = new RefrenceGC();
          objA.instance = objB;
          objB.instance = objA;

          objA = null;
          objB = null;
     }
}

  • 可達(dá)性分析算法
    在主流的商用程序語(yǔ)言(Java,C#,Lisp)的主流實(shí)現(xiàn)中,都是稱通過(guò)可達(dá)性分析來(lái)判定對(duì)象是否存活沈矿。
    思路: 通過(guò)一系列稱為“GC Roots”的對(duì)象作為起始點(diǎn)上真,從這些節(jié)點(diǎn)開(kāi)始向下搜索,搜索走過(guò)的路徑稱為引用鏈(Reference Chain)羹膳,當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈相連時(shí)(用圖論的話來(lái)說(shuō)睡互,就是從GC Roots到這個(gè)對(duì)象不可達(dá)),則證明此對(duì)象是不可用的陵像。
可達(dá)性分析算法.png

圖中對(duì)象object5,object6,object7雖然相互有關(guān)聯(lián)就珠,但是它們到GC Roots是不可達(dá)的撇吞,因?yàn)樗鼈儗?huì)被判定為可回收對(duì)象凿试。

生存還是死亡
即使在可達(dá)性分析后的不可達(dá)對(duì)象即舌,也不是“非死不可”僻弹,如果要真正宣告死亡冶伞,至少經(jīng)歷兩次標(biāo)記過(guò)程:如果對(duì)象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)沒(méi)有與GC Roots相連接的引用鏈丙躏,就會(huì)被第一次進(jìn)行標(biāo)記并且進(jìn)行一次刪選谚攒,判斷是否有必要執(zhí)行finalize()方法鸡典,當(dāng)對(duì)象沒(méi)有覆蓋finalize()方法腰耙,或者finalize()方法已經(jīng)被虛擬機(jī)調(diào)用過(guò)榛丢,即會(huì)被判為沒(méi)有必要執(zhí)行。
如果被判定為有必要執(zhí)行的finalize()方法挺庞,對(duì)象將會(huì)被放置在F-Queue的隊(duì)列中晰赞,會(huì)有個(gè)低優(yōu)先級(jí)的Finalizer線程去執(zhí)行,finalize()方法是對(duì)象逃脫死亡命運(yùn)的最后一次機(jī)會(huì),如果要拯救自己宾肺,就需要重新與引用鏈上的任意一個(gè)對(duì)象建立起關(guān)聯(lián)即可溯饵。

垃圾收集算法

標(biāo)記-清除算法

對(duì)需要回收的進(jìn)行標(biāo)記,然后清除標(biāo)記對(duì)象锨用。
缺點(diǎn):
1丰刊、效率低,標(biāo)記和清除兩個(gè)過(guò)程的效率都不高
2增拥、空間問(wèn)題啄巧,標(biāo)記清除后產(chǎn)生大量不連續(xù)的內(nèi)存碎片,在下次分配較大的對(duì)象時(shí)掌栅,無(wú)法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾回收秩仆。

標(biāo)記清除.png

復(fù)制算法

將內(nèi)存按照等容量分為兩塊,每次只使用其中一塊猾封,一塊用完澄耍,將還存活的復(fù)制到另一塊上,然后進(jìn)行整塊清除晌缘。
缺點(diǎn):內(nèi)存縮為原來(lái)的一半

商業(yè)化虛擬機(jī)采用此種方式齐莲,不按標(biāo)準(zhǔn)的1:1劃分,而是劃分一塊大的Eden 和兩塊小的Survivor空間磷箕,每次使用Eden和一塊小的Survivor,使用完选酗,將存活的復(fù)制到另一塊小的Survivor上,然后清除Eden和那塊Survivor岳枷。默認(rèn)Eden 和Survivor比為8:1芒填。

標(biāo)記-整理算法

標(biāo)記后,讓所有存活的往一端移動(dòng)空繁,直接清理端邊界外面的內(nèi)存

標(biāo)記整理.png

分代收集算法
一般劃分為新生代和老年代殿衰,新生代少量對(duì)象存活,采用復(fù)制算法盛泡,老年代對(duì)象存活率高播玖,采用標(biāo)記-清除或者標(biāo)記-整理方法去處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭于,一起剝皮案震驚了整個(gè)濱河市蜀踏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掰吕,老刑警劉巖果覆,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異殖熟,居然都是意外死亡局待,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钳榨,“玉大人舰罚,你說(shuō)我怎么就攤上這事⊙Τ埽” “怎么了营罢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饼齿。 經(jīng)常有香客問(wèn)我饲漾,道長(zhǎng),這世上最難降的妖魔是什么缕溉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任考传,我火速辦了婚禮,結(jié)果婚禮上证鸥,老公的妹妹穿的比我還像新娘僚楞。我一直安慰自己,他們只是感情好枉层,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布泉褐。 她就那樣靜靜地躺著,像睡著了一般返干。 火紅的嫁衣襯著肌膚如雪兴枯。 梳的紋絲不亂的頭發(fā)上血淌,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天矩欠,我揣著相機(jī)與錄音,去河邊找鬼悠夯。 笑死癌淮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沦补。 我是一名探鬼主播乳蓄,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夕膀!你這毒婦竟也來(lái)了虚倒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤产舞,失蹤者是張志新(化名)和其女友劉穎魂奥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體易猫,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耻煤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈蝇。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棺妓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炮赦,到底是詐尸還是另有隱情怜跑,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布眼五,位于F島的核電站妆艘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏看幼。R本人自食惡果不足惜批旺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诵姜。 院中可真熱鬧汽煮,春花似錦、人聲如沸棚唆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宵凌。三九已至鞋囊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞎惫,已是汗流浹背溜腐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓜喇,地道東北人挺益。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乘寒,于是被迫代替她去往敵國(guó)和親望众。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 最近學(xué)習(xí)Python的GC機(jī)制時(shí)伞辛,想到了java的GC烂翰,忘得差不多了,(⊙﹏⊙)bT槭稀甘耿!這里便做一下回顧總結(jié)。推薦周...
    廿陸小生閱讀 841評(píng)論 0 0
  • 一瞧捌、什么是GC 在Java中棵里,對(duì)象所占用的內(nèi)存在對(duì)象不再使用后會(huì)自動(dòng)被回收润文。這些工作是由一個(gè)叫垃圾回收器 Garb...
    Elder閱讀 4,996評(píng)論 0 1
  • 一、前言 JAVA GC(Garbage Collection殿怜,垃圾回收)機(jī)制是區(qū)別C++的一個(gè)重要特征典蝌,C...
    EnjoyAndroid閱讀 1,409評(píng)論 0 3
  • 原文閱讀 前言 這段時(shí)間懈怠了,罪過(guò)头谜! 最近看到有同事也開(kāi)始用上了微信公眾號(hào)寫(xiě)博客了骏掀,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 5,952評(píng)論 2 31
  • 1.我們知道在Php中準(zhǔn)備語(yǔ)句的執(zhí)行有execute(array())的方式柱告,還有bindParam()的方式截驮,但...
    Jacqueline_JS閱讀 1,346評(píng)論 1 0