垃圾回收機(jī)制

1.引用計數(shù)法

算法分析
  • 引用計數(shù)是垃圾收集器中的早期策略。在這種方法中蒸辆,堆中每個對象實例都有一個引用計數(shù)。當(dāng)一個對象被創(chuàng)建時柒室,且將該對象實例分配給一個變量逗宜,該變量計數(shù)設(shè)置為1空骚。當(dāng)任何其它變量被賦值為這個對象的引用時,計數(shù)加1(a = b,則b引用的對象實例的計數(shù)器+1)囤屹,但當(dāng)一個對象實例的某個引用超過了生命周期或者被設(shè)置為一個新值時,對象實例的引用計數(shù)器減1乡括。任何引用計數(shù)器為0的對象實例可以被當(dāng)作垃圾收集。當(dāng)一個對象實例被垃圾收集時诲泌,它引用的任何對象實例的引用計數(shù)器減1敷扫。
優(yōu)缺點

優(yōu)點 引用計數(shù)收集器可以很快地執(zhí)行,穿插在程序運行的過程當(dāng)中葵第,對程序需要不被長時間打斷的情形下十分實用
缺點 無法檢測出循環(huán)引用,如父對象有一個對子對象的引用缀台,子對象反過來引用父對象哮奇。這樣,他們的引用計數(shù)永遠(yuǎn)不可能為0.

缺點 無法檢測出循環(huán)引用屏镊,如父對象有一個對子對象的引用,子對象反過來引用父對象律罢。這樣棍丐,他們的引用計數(shù)永遠(yuǎn)不可能為0.

2.清除算法

根搜索算法是從離散數(shù)學(xué)中的圖論引入的,程序把所有的引用關(guān)系看作一張圖巾钉,從一個節(jié)點GC ROOT開始秘案,尋找對應(yīng)的引用節(jié)點,找到這個節(jié)點以后阱高,繼續(xù)尋找這個節(jié)點的引用節(jié)點,當(dāng)所有的引用節(jié)點尋找完畢之后吼旧,剩余的節(jié)點則被認(rèn)為是沒有被引用到的節(jié)點未舟,即無用的節(jié)點掂为。

java中可作為GC Root的對象有:
虛擬機(jī)棧中引用的對象(本地變量表)员串;
方法區(qū)中靜態(tài)屬性引用的對象;
方法區(qū)中常量引用的對象昵济;
本地方法棧中引用的對象(Native對象)访忿。

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

標(biāo)記-清除算法采用從根集合進(jìn)行掃描,對存活的對象對象標(biāo)記海铆,標(biāo)記完畢后,再掃描整個空間中未被標(biāo)記的對象殴边,進(jìn)行回收珍语,如上圖所示。標(biāo)記-清除算法不需要進(jìn)行對象的移動板乙,并且僅對不存活的對象進(jìn)行處理,在存活對象比較多的情況下極為高效蛋铆,但由于標(biāo)記-清除算法直接回收不存活的對象放接,因此會造成內(nèi)存碎片

標(biāo)記-整理算法采用標(biāo)記-清除算法一樣的方式進(jìn)行對象的標(biāo)記,但在清除時不同玛瘸,在回收不存活的對象占用的空間后乳乌,會將所有的存活對象往左端空閑空間移動市咆,并更新對應(yīng)的指針。標(biāo)記-整理算法是在標(biāo)記-清除算法的基礎(chǔ)上蒙兰,又進(jìn)行了對象的移動芒篷,因此成本更高采缚,但是卻解決了內(nèi)存碎片的問題。在基于Compacting算法的收集器的實現(xiàn)中篡帕,一般增加句柄和句柄表贸呢。

3. copying算法

該算法的提出是為了克服句柄的開銷和解決堆碎片的垃圾回收。它開始時把堆分成 一個對象 面和多個空閑面怔鳖, 程序從對象面為對象分配空間固蛾,當(dāng)對象滿了,基于copying算法的垃圾收集就從根集中掃描活動對象艾凯,并將每個活動對象復(fù)制到空閑面(使得活動對象所占的內(nèi)存之間沒有空閑洞),這樣空閑面變成了對象面斜姥,原來的對象面變成了空閑面沧竟,程序會在新的對象面中分配內(nèi)存。
一種典型的基于coping算法的垃圾回收是stop-and-copy算法杈笔,它將堆分成對象面和空閑區(qū)域面糕非,在對象面與空閑區(qū)域面的切換過程中,程序暫停執(zhí)行朽肥。

4.分代算法
  • 年輕代:(Young Generation)

所有新生成的對象首先都是放在年輕代的。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對象篱昔。
新生代內(nèi)存按照8:1:1的比例分為一個eden區(qū)和兩個survivor(survivor0,survivor1)區(qū)。一個Eden區(qū)空执,兩個Survivor區(qū)(一般而言)穗椅。大部分對象在Eden區(qū)中生成∑ケ恚回收時先將eden區(qū)存活對象復(fù)制到一個survivor0區(qū),然后清空eden區(qū)拜鹤,當(dāng)這個survivor0區(qū)也存放滿了時流椒,則將eden區(qū)和survivor0區(qū)存活對象復(fù)制到另一個survivor1區(qū),然后清空eden和這個survivor0區(qū)惯裕,此時survivor0區(qū)是空的绣硝,然后將survivor0區(qū)和survivor1區(qū)交換,即保持survivor1區(qū)為空鹉胖,如此往復(fù)。
當(dāng)survivor1區(qū)不足以存放 eden和survivor0的存活對象時挠铲,就將存活對象直接存放到老年代寂诱。若是老年代也滿了就會觸發(fā)一次Full GC,也就是新生代瓢棒、老年代都進(jìn)行回收
新生代發(fā)生的GC也叫做Minor GC丘喻,MinorGC發(fā)生頻率比較高(不一定等Eden區(qū)滿了才觸發(fā))。

  • 老年代(Old Generation)

在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象泉粉,就會被放到年老代中。因此窘面,可以認(rèn)為年老代中存放的都是一些生命周期較長的對象叽躯。
內(nèi)存比新生代也大很多(大概比例是1:2),當(dāng)老年代內(nèi)存滿時觸發(fā)Major GC即Full GC酣难,F(xiàn)ull GC發(fā)生頻率比較低黑滴,老年代對象存活時間比較長,存活率標(biāo)記高

  • 持久代(Permanent Generation): (JDK8 以棄用)

用于存放靜態(tài)文件菜谣,如Java類晚缩、方法等。持久代對垃圾回收沒有顯著影響荞彼,但是有些應(yīng)用可能動態(tài)生成或者調(diào)用一些class,例如Hibernate 等抓谴,在這種時候需要設(shè)置一個比較大的持久代空間來存放這些運行過程中新增的類寞缝。

  • Serial收集器(復(fù)制算法):新生代單線程收集器,標(biāo)記和清理都是單線程措拇,優(yōu)點是簡單高效
  • ParNew收集器(停止-復(fù)制算法):新生代收集器,可以認(rèn)為是Serial收集器的多線程版本,在多核CPU下有著比Serial更好的表現(xiàn)
  • Parallel Scavenge收集器(停止-復(fù)制算法):并行收集器砰左,追求高吞吐量,高效利用CPU。吞吐量一般為99%, 吞吐量= 用戶線程時間/(用戶線程時間+GC線程時間)稚新。適合后臺應(yīng)用等對交互相應(yīng)要求不高的場景。
  • Serial Old(標(biāo)記-整理算法):老年代單線程收集器褂删,Serial收集器的老年代版本
  • Parallel Old(停止-復(fù)制算法):Parallel Scavenge收集器的老年代版本,并行收集器缅帘,吞吐量優(yōu)先
  • CMS(Concurrent Mark Sweep)(標(biāo)記-清理算法):高并發(fā)难衰、低停頓,追求最短GC回收停頓時間盖袭,cpu占用比較高鳄虱,響應(yīng)時間快,停頓時間短醇蝴,多核cpu 追求高響應(yīng)時間的選擇。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霉涨,一起剝皮案震驚了整個濱河市惭适,隨后出現(xiàn)的幾起案子癞志,更是在濱河造成了極大的恐慌,老刑警劉巖凄杯,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戒突,死亡現(xiàn)場離奇詭異,居然都是意外死亡膊存,警方通過查閱死者的電腦和手機(jī)忱叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門韵丑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虚缎,“玉大人,你說我怎么就攤上這事千康〔” “怎么了值桩?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長携栋。 經(jīng)常有香客問我咳秉,道長,這世上最難降的妖魔是什么向挖? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任炕舵,我火速辦了婚禮,結(jié)果婚禮上溶推,老公的妹妹穿的比我還像新娘奸攻。我一直安慰自己,他們只是感情好辐赞,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布疏橄。 她就那樣靜靜地躺著略就,像睡著了一般晃酒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崔兴,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天敲茄,我揣著相機(jī)與錄音山析,去河邊找鬼。 笑死笋轨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仅讽。 我是一名探鬼主播钾挟,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼掺出,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛛砰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎位仁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧嘶,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡琳疏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了书幕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡苛骨,死狀恐怖苟呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情严衬,我是刑警寧澤两波,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布腰奋,位于F島的核電站,受9級特大地震影響劣坊,放射性物質(zhì)發(fā)生泄漏屈留。R本人自食惡果不足惜局冰,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灌危。 院中可真熱鬧康二,春花似錦、人聲如沸勇蝙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽味混。三九已至产雹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁锡,已是汗流浹背蔓挖。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留馆衔,地道東北人瘟判。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拷获,于是被迫代替她去往敵國和親梨熙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361