Java學(xué)習(xí)筆記---垃圾收集算法

在Java堆里存放著Java世界里幾乎所有的對(duì)象實(shí)例奕筐,垃圾收集器在對(duì)堆進(jìn)行回收前,第一件事情就是要確定這些對(duì)象之中哪些還 “存活”著徘钥,哪些已經(jīng)“死去”(即不可能再被任何途徑使用的對(duì)象)衔蹲。

對(duì)象存活判定算法

1、引用計(jì)數(shù)算法

給對(duì)象中添加一個(gè)引用計(jì)數(shù)器呈础,每當(dāng)有一個(gè)地方引用它時(shí)舆驶,計(jì)數(shù)器值就加1;當(dāng)引用失效時(shí)而钞,計(jì)數(shù)器就減1沙廉;任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能在被使用的。
主流的Java虛擬機(jī)里面沒有選用引用計(jì)數(shù)算法來管理內(nèi)存臼节,其中最主要的原因就是它很難解決對(duì)象之間相互循環(huán)引用的問題撬陵。

2、可達(dá)性分析算法

在主流的商用程序語音(Java网缝、C#等)的實(shí)現(xiàn)中巨税,都是稱通過可達(dá)性分析算法來判定對(duì)象是否存活的。這個(gè)算法的基本思想就是通過一系列的稱為“GC Roots”的對(duì)象作為起始點(diǎn)粉臊,從這些節(jié)點(diǎn)開始向下搜索草添,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí)维费,則證明此對(duì)象是不可用的果元。如圖所示,對(duì)象object5犀盟、object6而晒、object7雖然互相有關(guān)聯(lián),但是他們到GC Roots是不可達(dá)的阅畴,所以他們將會(huì)被判定為是可回收的對(duì)象倡怎。


gc-root.jpg
在Java中,可作為GC Roots的對(duì)象包括:
1、虛擬機(jī)棧(棧幀中的本地變量表)中的引用對(duì)象监署。
2颤专、方法區(qū)中類靜態(tài)屬性引用的對(duì)象。
3钠乏、方法區(qū)中常量引用的對(duì)象栖秕。
4、本地方法棧中JNI(Native方法)引用的對(duì)象晓避。





無論是通過引用計(jì)數(shù)算法判斷對(duì)象的引用數(shù)量簇捍,還是通過可達(dá)性分析算法判斷對(duì)象的引用鏈?zhǔn)欠窨蛇_(dá),判定對(duì)象是否存活都與“引用”有關(guān)俏拱。在JDK1.2以前暑塑,Java中引用的定義很傳統(tǒng):如果reference類型的數(shù)據(jù)中存儲(chǔ)的數(shù)值代表的是另外一塊內(nèi)存的起始地址,就稱這塊內(nèi)存代表著一個(gè)引用锅必。
在JDK1.2以后事格,Java對(duì)引用的概念進(jìn)行了擴(kuò)充,將引用分為強(qiáng)引用(Strong Reference)搞隐、軟引用(Soft Reference)驹愚、弱引用(Weak Reference)、虛引用(Phantom Reference)劣纲。這四種引用強(qiáng)度一次逐漸減弱么鹤。

強(qiáng)引用:

強(qiáng)引用就是指在程序代碼中普遍存在的,類似“Object obj=newObject()”這類的引用味廊,只要引用還存在,垃圾收集器永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象棠耕。

軟引用:

軟引用是用來描述一些還有用但并非必需的對(duì)象余佛。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,在系統(tǒng)將要發(fā)生內(nèi)存溢出之前窍荧,將會(huì)把這些對(duì)象列進(jìn)回收范圍之中進(jìn)行第二次收回辉巡。如果這次回收還沒有做夠的內(nèi)存,才會(huì)拋出內(nèi)存溢出異常蕊退。

弱引用:

弱引用也是用來描述非必需對(duì)象的郊楣,但是它的強(qiáng)度比軟引用更弱一些,被弱引用關(guān)聯(lián)的對(duì)象只能生存到下一次垃圾收集器發(fā)生之前瓤荔。當(dāng)垃圾會(huì)收集器工作時(shí)净蚤,無論當(dāng)前的內(nèi)存是否足夠,都會(huì)回收掉只被弱引用關(guān)聯(lián)的對(duì)象输硝。

虛引用:

虛引用是最弱的一種引用關(guān)系今瀑。一個(gè)對(duì)象是否有虛引用的存在,完全不會(huì)對(duì)齊生存時(shí)間構(gòu)成影響,也無法通過虛引用來取得一個(gè)對(duì)象的實(shí)例橘荠。為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個(gè)對(duì)象被收集器回收時(shí)收到一個(gè)通知屿附。

垃圾收集算法

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

“標(biāo)記-清除”算法是最基礎(chǔ)的收集算法哥童,分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象挺份,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象。

  它的主要不足有兩個(gè):
  一是效率問題贮懈,標(biāo)記和清除兩個(gè)過程的效率都不高匀泊;
  另一個(gè)是空間問題標(biāo)記之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,
  空間碎片大多可能導(dǎo)致以后再程序運(yùn)行過程中需要分配較大對(duì)象時(shí)错邦,
  無法找到足夠的連續(xù)內(nèi)存空間而不得不提前出發(fā)另一次垃圾收集動(dòng)作探赫。
標(biāo)記-清除 算法.jpg

2、復(fù)制算法

它將可用的內(nèi)存按容量劃分為大小相等的兩塊撬呢,每次只使用其中的一塊伦吠。當(dāng)這一塊內(nèi)存用完了,就將還存活著的對(duì)象復(fù)制到另外一塊上面魂拦,然后在把已使用過的內(nèi)存空間一次清理掉毛仪。這樣就使得每次都是針對(duì)整個(gè)半?yún)^(qū)進(jìn)行內(nèi)存回收。

  缺點(diǎn)是:將內(nèi)存縮小一半芯勘。
復(fù)制算法.jpg

3箱靴、標(biāo)記-整理算法

標(biāo)記過程與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不只是清理對(duì)象荷愕,而是清理完對(duì)象后所有對(duì)象都向一端移動(dòng)衡怀,并更新引用指針。

缺點(diǎn)是還是會(huì)進(jìn)行對(duì)象移動(dòng)安疗,成本較高抛杨。
好處是不會(huì)產(chǎn)生內(nèi)存碎片。
標(biāo)記-整理 算法.jpg

4荐类、分代收集算法

當(dāng)前商業(yè)虛擬機(jī)的垃圾收集器都采用“分代收集”算法怖现。根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊。一般是把Java堆分為新生代和老年代玉罐。在新生代中屈嗤,每次垃圾收集時(shí)都會(huì)有大批對(duì)象死去,只有少量存活吊输,就用復(fù)制算法饶号,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集。而老年代中因?yàn)閷?duì)象存活率高季蚂、沒有額外空間對(duì)他進(jìn)行分配擔(dān)保讨韭,就必須采用“標(biāo)記-清理”或者“標(biāo)記-整理”算法來進(jìn)行回收脂信。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市透硝,隨后出現(xiàn)的幾起案子狰闪,更是在濱河造成了極大的恐慌,老刑警劉巖濒生,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埋泵,死亡現(xiàn)場離奇詭異,居然都是意外死亡罪治,警方通過查閱死者的電腦和手機(jī)丽声,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉义,“玉大人雁社,你說我怎么就攤上這事∩购В” “怎么了霉撵?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洪囤。 經(jīng)常有香客問我徒坡,道長,這世上最難降的妖魔是什么瘤缩? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任喇完,我火速辦了婚禮,結(jié)果婚禮上剥啤,老公的妹妹穿的比我還像新娘锦溪。我一直安慰自己,他們只是感情好府怯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布海洼。 她就那樣靜靜地躺著,像睡著了一般富腊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上域帐,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天赘被,我揣著相機(jī)與錄音,去河邊找鬼肖揣。 笑死民假,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的龙优。 我是一名探鬼主播羊异,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了野舶?” 一聲冷哼從身側(cè)響起易迹,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎平道,沒想到半個(gè)月后睹欲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡一屋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窘疮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀墨。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闸衫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诽嘉,到底是詐尸還是另有隱情蔚出,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布含懊,位于F島的核電站身冬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岔乔。R本人自食惡果不足惜酥筝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雏门。 院中可真熱鬧嘿歌,春花似錦、人聲如沸茁影。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽募闲。三九已至步脓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浩螺,已是汗流浹背靴患。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留要出,地道東北人鸳君。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像患蹂,于是被迫代替她去往敵國和親或颊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砸紊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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