【JAVA提升】- GC算法及垃圾回收器

GC算法及收集器

1 GC的概念

垃圾收集 Garbage Collection 通常被稱為“GC”惹谐,它誕生于1960年 MIT 的 Lisp 語言晚凿,經(jīng)過半個(gè)多世紀(jì),目前已經(jīng)十分成熟了帅刊。

jvm 中全闷,程序計(jì)數(shù)器绩郎、虛擬機(jī)棧、本地方法棧都是線程私有的翁逞,它們隨線程而生肋杖,隨線程而滅。棧幀隨著方法的進(jìn)入和退出做入棧和出棧操作挖函,實(shí)現(xiàn)了自動(dòng)的內(nèi)存清理状植。
因此,我們的內(nèi)存垃圾回收主要集中于 java 堆和方法區(qū)中挪圾,在程序運(yùn)行期間浅萧,這部分內(nèi)存的分配和使用都是動(dòng)態(tài)的.

2 對(duì)象存活判斷

判斷對(duì)象是否存活一般有兩種方式:

  • 引用計(jì)數(shù): 每個(gè)對(duì)象有一個(gè)引用計(jì)數(shù)屬性,新增一個(gè)引用時(shí)計(jì)數(shù)加1哲思,引用釋放時(shí)計(jì)數(shù)減1洼畅,計(jì)數(shù)為0時(shí)可以回收。此方法簡單棚赔,但是無法解決對(duì)象相互循環(huán)引用的問題帝簇。

  • 可達(dá)性分析(Reachability Analysis): 從GC Roots開始向下搜索,搜索所走過的路徑稱為引用鏈靠益。當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí)丧肴,則證明此對(duì)象是不可用的。不可達(dá)對(duì)象胧后。

在java中芋浮,可作為GC Roots的對(duì)象有:

1.虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象;

2.方法區(qū)中的類靜態(tài)屬性引用的對(duì)象壳快;

3.方法區(qū)中常量引用的對(duì)象纸巷;

4.本地方法棧中JNI(即一般說的Native方法)中引用的對(duì)象

關(guān)于GC Roots具體說明(建議看下)

3 垃圾收集算法

3.1 標(biāo)記清除(Mark-Sweep)

  • “標(biāo)記-清除”(Mark-Sweep)
    算法分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象(引用計(jì)數(shù)法或者可達(dá)性分析)瘤旨,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對(duì)象。
    它是最基礎(chǔ)的收集算法竖伯,后續(xù)的收集算法都是基于這種思路并對(duì)其缺點(diǎn)進(jìn)行改進(jìn)而得到的存哲。

  • 缺點(diǎn):
    它的主要缺點(diǎn)有兩個(gè):一個(gè)是效率問題,標(biāo)記和清除過程的效率都不高七婴;另外一個(gè)是空間問題祟偷,標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會(huì)導(dǎo)致打厘,當(dāng)程序在以后的運(yùn)行過程中需要分配較大對(duì)象時(shí)無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作修肠。

mark-sweep.jpg

3.2 復(fù)制(Copying)

  • “復(fù)制”(Copying)
    復(fù)制算法在標(biāo)記清除算法的基礎(chǔ)上,針對(duì)內(nèi)存碎片問題做了一下優(yōu)化婚惫,此算法把內(nèi)存分為大小相同的兩塊氛赐,每次在使用的時(shí)候只使用其中的一塊。
    當(dāng)一塊內(nèi)存用完的時(shí)候先舷。把存活對(duì)象復(fù)制到另外的一塊中艰管,然后清除當(dāng)前這塊中的所有的對(duì)象,如此反復(fù)蒋川。
  • 缺點(diǎn):
    使用當(dāng)前算法牲芋,解決了內(nèi)存碎片化嚴(yán)重的問題,但是存在缺陷就是每次只使用一般的空間捺球,空間利用率受到影響缸浦。同時(shí)對(duì)于存活周期長的對(duì)象,復(fù)制次數(shù)多氮兵。
copying.jpg

3.3 標(biāo)記整理(Mark-Compact)

復(fù)制收集算法在對(duì)象存活率較高時(shí)就要執(zhí)行較多的復(fù)制操作裂逐,效率將會(huì)變低。更關(guān)鍵的是泣栈,如果不想浪費(fèi)50%的空間卜高,就需要有額外的空間進(jìn)行分配擔(dān)保,
以應(yīng)對(duì)被使用的內(nèi)存中所有對(duì)象都100%存活的極端情況南片,所以在老年代一般不能直接選用這種算法掺涛。

根據(jù)老年代的特點(diǎn),有人提出了另外一種“標(biāo)記-整理”(Mark-Compact)算法疼进,標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣薪缆,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,
而是讓所有存活的對(duì)象都向一端移動(dòng)伞广,然后直接清理掉端邊界以外的內(nèi)存

mark-compact.jpg

3.4 分代收集算法(Generational Collection)

GC分代的基于一個(gè)假設(shè):絕大部分對(duì)象的生命周期都非常短暫拣帽,存活時(shí)間短。

“分代收集”(Generational Collection)算法赔癌,把Java堆分為新生代和老年代诞外,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?/p>

  • 新生代中,每次垃圾收集時(shí)都發(fā)現(xiàn)有大批對(duì)象死去灾票,只有少量存活峡谊,那就選用復(fù)制算法,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集刊苍。
  • 老年代中因?yàn)閷?duì)象存活率高既们、沒有額外空間對(duì)它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記-清理”或“標(biāo)記-整理”算法來進(jìn)行回收正什。

4 垃圾收器及常用組合

  • 新生代

    • Serial收集器(單線程)
    • ParNew收集器(多線程)
    • Parallel Scavenge收集器
  • 老年代

    • Serial Old(MSC)收集器
    • Parallel Old收集器
    • CMS(Concurrent Mark Sweep)收集器
  • 新老年代都適合

    • G1收集器

參考:常見JVM垃圾收集器一覽


參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啥纸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婴氮,更是在濱河造成了極大的恐慌斯棒,老刑警劉巖盾致,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荣暮,居然都是意外死亡庭惜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門穗酥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來护赊,“玉大人,你說我怎么就攤上這事砾跃】” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵抽高,是天一觀的道長判耕。 經(jīng)常有香客問我,道長翘骂,這世上最難降的妖魔是什么祈秕? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮雏胃,結(jié)果婚禮上请毛,老公的妹妹穿的比我還像新娘。我一直安慰自己瞭亮,他們只是感情好方仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著统翩,像睡著了一般仙蚜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厂汗,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天委粉,我揣著相機(jī)與錄音,去河邊找鬼娶桦。 笑死贾节,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衷畦。 我是一名探鬼主播栗涂,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祈争!你這毒婦竟也來了斤程?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤菩混,失蹤者是張志新(化名)和其女友劉穎忿墅,沒想到半個(gè)月后扁藕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疚脐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年纹磺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亮曹。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秘症,靈堂內(nèi)的尸體忽然破棺而出照卦,到底是詐尸還是另有隱情,我是刑警寧澤乡摹,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布役耕,位于F島的核電站,受9級(jí)特大地震影響聪廉,放射性物質(zhì)發(fā)生泄漏瞬痘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一板熊、第九天 我趴在偏房一處隱蔽的房頂上張望框全。 院中可真熱鬧,春花似錦干签、人聲如沸津辩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喘沿。三九已至,卻和暖如春竭贩,著一層夾襖步出監(jiān)牢的瞬間蚜印,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工留量, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窄赋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓楼熄,卻偏偏與公主長得像寝凌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孝赫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359