JVM垃圾收集算法與演變過(guò)程介紹

JVM的垃圾回收的算法

什么是垃圾

沒(méi)有引用指向的任何對(duì)象

一柳沙、標(biāo)記清除算法(Mark-Sweep)

標(biāo)記清除算法是最基礎(chǔ)的回收算法,該算法包括兩個(gè)階段:①標(biāo)記階段 ②清除階段
標(biāo)記階段:根據(jù)可達(dá)性分析算法找出需要回收的對(duì)象進(jìn)行標(biāo)記利诺。
清除階段:統(tǒng)一回收被標(biāo)記的對(duì)象.


圖片.png

該算法的優(yōu)點(diǎn)和不足:
優(yōu)點(diǎn):
1.一目了然的就是邏輯簡(jiǎn)單,之后的算法也是在此基礎(chǔ)上進(jìn)行優(yōu)化。
不足:
1.效率問(wèn)題:標(biāo)記和清理的效率都不高(第一次掃描標(biāo)記不可回收對(duì)象–根可達(dá)標(biāo)記為存活對(duì)象,第二遍清除沒(méi)有被標(biāo)記的對(duì)象)
2空間問(wèn)題:清除的時(shí)候规辱,只是將零散的存儲(chǔ)在內(nèi)存中的對(duì)象進(jìn)行回收绿鸣,沒(méi)有進(jìn)行整理疚沐,導(dǎo)致很多零散的,不完整的內(nèi)存區(qū)域潮模,如果想再存儲(chǔ)較大的對(duì)象時(shí)亮蛔,就會(huì)促使再次進(jìn)行一次回收。

二擎厢、復(fù)制算法(Copying)

復(fù)制算法是為了解決標(biāo)記清除算法效率不高而產(chǎn)生的究流。該算法的思路就是將內(nèi)存空間一分為二,一模一樣大小相等的內(nèi)存空間动遭。每次只使用其中一塊來(lái)存儲(chǔ)對(duì)象,當(dāng)這一塊內(nèi)存使用的差不多的時(shí)候厘惦,將這塊中還存活的對(duì)象復(fù)制到另一塊內(nèi)存中,然后將原來(lái)的已經(jīng)使用過(guò)的內(nèi)存完全清理掉宵蕉。


圖片.png

這種算法的優(yōu)點(diǎn)和不足:
優(yōu)點(diǎn):每次回收對(duì)一半的空間進(jìn)行回收,也不需要考慮內(nèi)存碎片化羡玛,不整合的問(wèn)題了。提升了回收效率稼稿。
不足:對(duì)內(nèi)存一分為二讳窟,始終對(duì)一半的內(nèi)存操作,浪費(fèi)了一半的內(nèi)存

三挪钓、標(biāo)記-整理算法(Mark-Compact)

標(biāo)記-整理算法采用標(biāo)記-清除算法一樣的標(biāo)記方式進(jìn)行對(duì)象的標(biāo)記,但在清除時(shí)不同碌上,在回收那些不存活的對(duì)象占用的空間后,將后面活著的對(duì)象依次向前移動(dòng)浦徊。將所有活著的對(duì)象都移動(dòng)成內(nèi)存空間中一段連續(xù)的區(qū)域,之后的連續(xù)區(qū)域都是可分配的沒(méi)有使用的內(nèi)存空間盔性。因此成本很高霞丧,但是解決了碎片化內(nèi)存的問(wèn)題。


圖片.png

四冕香、分代收集算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法蛹尝。其核心思想是根據(jù)對(duì)象存活的生命周期將內(nèi)存劃分為若干個(gè)不同的區(qū)域。一般情況下將堆區(qū)劃分為老年代和新生代悉尾,在堆區(qū)之外還有一個(gè)永久代突那。老年代的特點(diǎn)就是每次垃圾回收時(shí)只有少量的對(duì)象需要被回收,而新生代每次回收時(shí)都有大量的對(duì)象需要被回收构眯,于是該算法就是根據(jù)這些代的特點(diǎn)采取合適的收集算法
接下來(lái)就逐一介紹下這些代的區(qū)別和對(duì)應(yīng)的回收算法:

1.年輕代

回收算法以Copying為主,新創(chuàng)建的對(duì)象都存放在這里愕难。因?yàn)榇蠖鄶?shù)對(duì)象很快變得不可達(dá),所以大多數(shù)對(duì)象在年輕代中創(chuàng)建惫霸,然后消失猫缭。當(dāng)對(duì)象從這塊內(nèi)存區(qū)域消失時(shí),我們說(shuō)發(fā)生了一次“minor GC”(次要回收)
所有新生成的對(duì)象首先都是放在年輕代的壹店。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象猜丹。
新生代內(nèi)存按照8:1:1的比例分為一個(gè)eden(伊甸)區(qū)和兩個(gè)survivor(幸存)(survivor0->surviverFrom,survivor1->survivoerTo)區(qū)。一個(gè)Eden區(qū)茫打,兩個(gè) Survivor區(qū)(一般而言)居触。大部分對(duì)象在Eden區(qū)中生成±铣啵回收時(shí)先將eden區(qū)存活對(duì)象復(fù)制到一個(gè)survivor0區(qū),然后清空eden區(qū)制市,當(dāng)這個(gè)survivor0區(qū)也存放滿了時(shí)抬旺,則將eden區(qū)和survivor0區(qū)存活對(duì)象復(fù)制到另一個(gè)survivor1區(qū),然后清空eden和這個(gè)survivor0區(qū)祥楣,此時(shí)survivor0區(qū)是空的开财,然后將survivor0區(qū)和survivor1區(qū)交換汉柒,即保持survivor1區(qū)為空, 如此往復(fù)责鳍。
當(dāng)survivor1區(qū)不足以存放 eden和survivor0的存活對(duì)象時(shí)碾褂,就將存活對(duì)象直接存放到老年代。若是老年代也滿了就會(huì)觸發(fā)一次Full GC(Major GC)历葛,也就是新生代正塌、老年代都進(jìn)行回收。
新生代發(fā)生的GC叫做Minor GC恤溶,MinorGC發(fā)生頻率比較高(不一定等Eden區(qū)滿了才觸發(fā))乓诽。

2.老年代

回收算法主要以標(biāo)記-整理算法Mark-Compact為主,沒(méi)有變得不可達(dá),存活下來(lái)的年輕代對(duì)象被復(fù)制到這里咒程。這塊內(nèi)存區(qū)域一般大于年輕代鸠天。因?yàn)樗蟮囊?guī)模,GC發(fā)生的次數(shù)比在年輕代的少帐姻。對(duì)象從老年代消失時(shí)稠集,我們說(shuō)“major GC”(或“full GC”)發(fā)生了
在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對(duì)象剥纷,就會(huì)被放到年老代中扛伍。因此刺洒,可以認(rèn)為年老代中存放的都是一些生命周期較長(zhǎng)的對(duì)象。
內(nèi)存比新生代也大很多(大概比例是1:2)鼎文,當(dāng)老年代內(nèi)存滿時(shí)觸發(fā)Major GC即Full GC因俐,F(xiàn)ull GC發(fā)生頻率比較低抹剩,老年代對(duì)象存活時(shí)間比較長(zhǎng),存活率標(biāo)記高胡嘿。

3.永久代

用于存放靜態(tài)文件钳踊,如Java類(lèi)、方法等缴罗。持久代對(duì)垃圾回收沒(méi)有顯著影響,但是有些應(yīng)用可能動(dòng)態(tài)生成或者調(diào)用一些class兵钮,例如Hibernate 等矢空,在這種時(shí)候需要設(shè)置一個(gè)比較大的永久代空間來(lái)存放這些運(yùn)行過(guò)程中新增的類(lèi)禀横。
??注意:這塊內(nèi)存區(qū)域絕對(duì)不是永久的存放從老年代存活下來(lái)的對(duì)象的!!!在這塊內(nèi)存中有可能發(fā)生垃圾回收。發(fā)生在這里垃圾回收也被稱(chēng)為major GC

G1

G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器酿箭,G1擁有獨(dú)特的垃圾回收策略缭嫡,從分代上看抬闷,G1依然屬于分代垃圾回收器,它會(huì)區(qū)分年代和老年代评架,依然有eden和survivor區(qū)纵诞,但從堆的結(jié)構(gòu)上看培遵,它并不要求整個(gè)eden區(qū)、年清代或者老年代都連續(xù)嗡呼。它使用了全新的分區(qū)算法晤锥。其特點(diǎn)如下:
并行性:G1在回收期間廊宪,可以由多個(gè)GC線程同時(shí)工作,有效利用多核計(jì)算能力壕翩。
并發(fā)性:G1擁有與應(yīng)用程序交替執(zhí)行的能力放妈,因此一般來(lái)說(shuō)荐操,不會(huì)在整個(gè)回收期間完全阻塞應(yīng)用程序。
分代GC:與之前回收器不同宅倒,其他回收器拐迁,它們要么工作在年輕代要么工作在老年代疗绣。G1可以同時(shí)兼顧年輕代與老年代。
空間整理:G1在回收過(guò)程中缓淹,會(huì)進(jìn)行適當(dāng)?shù)膶?duì)象移動(dòng)讯壶,不像CMS患雏,只是簡(jiǎn)單的標(biāo)記清除,在若干次GC后CMS必須進(jìn)行一次碎片整理丙挽,G1在每次回收時(shí)都會(huì)有效的復(fù)制對(duì)象颜阐,減少空間碎片吓肋。
可預(yù)見(jiàn)性:由于分區(qū)的原因,G1可以只選取部分區(qū)域進(jìn)行內(nèi)存回收肤舞,這樣縮小了回收范圍李剖,因此對(duì)于全局停頓也能得到更好的控制。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偶芍,一起剝皮案震驚了整個(gè)濱河市德玫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌材彪,老刑警劉巖查刻,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤类,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佃延,警方通過(guò)查閱死者的電腦和手機(jī)夷磕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)坐桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人膘螟,你說(shuō)我怎么就攤上這事荆残。” “怎么了内斯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵俘闯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我萄传,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任蹭睡,我火速辦了婚禮肩豁,結(jié)果婚禮上辫呻,老公的妹妹穿的比我還像新娘。我一直安慰自己祟昭,他們只是感情好怖侦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布匾寝。 她就那樣靜靜地躺著,像睡著了一般急凰。 火紅的嫁衣襯著肌膚如雪猜年。 梳的紋絲不亂的頭發(fā)上码倦,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天袁稽,我揣著相機(jī)與錄音,去河邊找鬼。 笑死歧沪,一個(gè)胖子當(dāng)著我的面吹牛诊胞,可吹牛的內(nèi)容都是我干的锹杈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼邪码,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闭专!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起影钉,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掘剪,失蹤者是張志新(化名)和其女友劉穎杖小,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體予权,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岗照,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年笆环,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躁劣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡志膀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烫止,到底是詐尸還是另有隱情戳稽,我是刑警寧澤惊奇,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吨铸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舟奠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耿戚。 院中可真熱鬧,春花似錦坛猪、人聲如沸皂股。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洋机。三九已至洋魂,卻和暖如春喜鼓,著一層夾襖步出監(jiān)牢的瞬間刁标,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留启搂,地道東北人胳赌。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓疑苫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撼短。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挺勿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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