Java 11 即將帶來(lái) ZGC 之際蟹腾,讓我們溫習(xí)一下垃圾回收

來(lái)自:開(kāi)源中國(guó)(oschina2013)

鏈接:https://www.oschina.net/translate/java-gc

如需轉(zhuǎn)載請(qǐng)注明上述信息,其他信息無(wú)效并視為侵權(quán)

什么是自動(dòng)垃圾回收钾麸?

自動(dòng)垃圾回收是指監(jiān)測(cè)堆內(nèi)存茁影、識(shí)別正在使用或未使用的對(duì)象、然后刪除那些未使用對(duì)象的過(guò)程确沸。正在使用中的對(duì)象捌锭,或者說(shuō)被引用的對(duì)象,是指程序中的某些地方仍然維護(hù)者指向該對(duì)象的指針罗捎。未使用的對(duì)象观谦,或者說(shuō)未被引用的對(duì)象,不再被程序中的任何地方引用桨菜。所以豁状,未被引用的對(duì)象所占用的內(nèi)存可以被回收捉偏。?

在像C這樣的編程語(yǔ)言中,分配和回收內(nèi)存需要手動(dòng)處理泻红。在Java中夭禽,內(nèi)存回收的過(guò)程由垃圾收集器自動(dòng)處理∫曷罚基本過(guò)程可以描述如下讹躯。

第一步:標(biāo)記

這個(gè)過(guò)程的第一步叫做標(biāo)記。這一階段缠劝,垃圾回收器識(shí)別哪些內(nèi)存正在使用潮梯,哪些內(nèi)存未被使用。

被引用的對(duì)象以藍(lán)色展示惨恭。未被引用的對(duì)象以金黃色展示秉馏。在標(biāo)記階段,所有對(duì)象都需要掃描并做出判斷喉恋。如果系統(tǒng)中的所有對(duì)象都必須掃描到沃饶,這將是一個(gè)非常耗時(shí)的過(guò)程。

第二步:常規(guī)刪除

這一階段轻黑,移除所有未被引用的對(duì)象糊肤,保留被引用的對(duì)象,并維護(hù)指向空閑內(nèi)存的指針氓鄙。

內(nèi)存分配器維護(hù)著空閑內(nèi)存塊的引用馆揉,新建對(duì)象的內(nèi)存將在這里被分配。

第二(a)步:刪除并整理

為了進(jìn)一步提高性能抖拦,除了刪除未被引用的對(duì)象升酣,還可以壓縮剩余的被引用對(duì)象(的空間占用)。把被引用的對(duì)象移動(dòng)到一起态罪,會(huì)使得新對(duì)象的內(nèi)存分配更容易噩茄、更快。


為什么使用分代垃圾回收?

如前所述复颈,標(biāo)記并整理所有JVM里的對(duì)象绩聘,效率是很低的。隨著越來(lái)越多的對(duì)象被分配耗啦,對(duì)象列表不斷增長(zhǎng)凿菩,導(dǎo)致垃圾回收時(shí)間越來(lái)越長(zhǎng)。然而帜讲,根據(jù)應(yīng)用程序的經(jīng)驗(yàn)分析衅谷,大多數(shù)的對(duì)象都是短命的。

下面是這類數(shù)據(jù)的一個(gè)例子似将。Y軸表示分配的字節(jié)數(shù)获黔,X軸表示隨著時(shí)間分配的字節(jié)數(shù)蚀苛。

正如你所看到的,隨著時(shí)間的推移肢执,仍然存活的對(duì)象越來(lái)越少枉阵。事實(shí)上译红,大多數(shù)對(duì)象的生命周期都很短预茄,如圖左側(cè)較高的值所示。

JVM分代

從對(duì)象分配行為中學(xué)到的內(nèi)容侦厚,可以用來(lái)提高JVM的性能耻陕。因此,可以考慮將堆分成更小的部分或者幾代刨沦。比如:年輕代诗宣、老年代、持久代想诅。

年輕代是用來(lái)分配和老化所有新對(duì)象的地方召庞。當(dāng)年輕代被填滿,將會(huì)觸發(fā)Minor GC来破。如果對(duì)象死亡率很高M(jìn)inor GC可以優(yōu)化篮灼。年輕代的所有死亡對(duì)象可以被迅速回收。一些存活對(duì)象會(huì)被老化徘禁,最終會(huì)被移動(dòng)到老年代诅诱。

Stop the World——所有Minor GC都會(huì)觸發(fā)“Stop the World”。這意味著所有應(yīng)用程序線程都會(huì)停止送朱,直到操作完成娘荡。Minor GC?總會(huì)觸發(fā)Stop the Word。


老年代用來(lái)保存長(zhǎng)時(shí)間存活的對(duì)象驶沼。通常炮沐,設(shè)置一個(gè)閾值,當(dāng)達(dá)到該年齡時(shí)回怜,年輕代對(duì)象會(huì)被移動(dòng)到老年代大年。最終老年代也會(huì)被回收。這個(gè)事件成為 Major GC鹉戚。

Major GC 也會(huì)觸發(fā)STW(Stop the World)鲜戒。通常,Major GC會(huì)慢很多抹凳,因?yàn)樗婕暗剿写婊顚?duì)象遏餐。所以,對(duì)于響應(yīng)性的應(yīng)用程序赢底,應(yīng)該盡量避免Major GC失都。還要注意柏蘑,Major GC的STW的時(shí)長(zhǎng)受年老代垃圾回收器類型的影響。

永久代包含JVM用于描述應(yīng)用程序中類和方法的元數(shù)據(jù)粹庞。永久代是由JVM在運(yùn)行時(shí)根據(jù)應(yīng)用程序使用的類來(lái)填充的咳焚。此外,Java SE類庫(kù)和方法也存儲(chǔ)在這里庞溜。

如果JVM發(fā)現(xiàn)某些類不再需要革半,并且其他類可能需要空間,則這些類可能會(huì)被回收流码。

世代垃圾收集過(guò)程

現(xiàn)在你已經(jīng)理解了為什么堆被分成不同的代又官,現(xiàn)在是時(shí)候看看這些空間是如何相互作用的。 后面的圖片將介紹JVM中的對(duì)象分配和老化過(guò)程漫试。

首先六敬,將任何新對(duì)象分配給 eden 空間。 兩個(gè) survivor?空間都是空的驾荣。

當(dāng) eden?空間填滿時(shí)外构,會(huì)觸發(fā)輕微的垃圾收集。

引用的對(duì)象被移動(dòng)到第一個(gè) survivor?空間播掷。 清除?eden?空間時(shí)审编,將刪除未引用的對(duì)象。

在下一次Minor GC中叮趴,Eden區(qū)也會(huì)做同樣的操作割笙。刪除未被引用的對(duì)象,并將被引用的對(duì)象移動(dòng)到Survivor區(qū)眯亦。然而伤溉,這里,他們被移動(dòng)到了第二個(gè)Survivor區(qū)(S1)妻率。此外乱顾,第一個(gè)Survivor區(qū)(S0)中,在上一次Minor GC幸存的對(duì)象宫静,會(huì)增加年齡走净,并被移動(dòng)到S1中。待所有幸存對(duì)象都被移動(dòng)到S1后孤里,S0和Eden區(qū)都會(huì)被清空伏伯。注意,Survivor區(qū)中有了不同年齡的對(duì)象捌袜。

在下一次Minor GC中说搅,會(huì)重復(fù)同樣的操作。不過(guò)虏等,這一次Survivor區(qū)會(huì)交換弄唧。被引用的對(duì)象移動(dòng)到S0,适肠。幸存的對(duì)象增加年齡。Eden區(qū)和S1被清空候引。

此幻燈片演示了 promotion侯养。 在較小的GC之后,當(dāng)老化的物體達(dá)到一定的年齡閾值(在該示例中為8)時(shí)澄干,它們從年輕一代晉升到老一代逛揩。

隨著較小的GC持續(xù)發(fā)生,物體將繼續(xù)被推廣到老一代空間傻寂。

所以這幾乎涵蓋了年輕一代的整個(gè)過(guò)程息尺。 最終携兵,將主要對(duì)老一代進(jìn)行GC疾掰,清理并最終壓縮該空間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徐紧,一起剝皮案震驚了整個(gè)濱河市静檬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌并级,老刑警劉巖拂檩,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘲碧,居然都是意外死亡稻励,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門愈涩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)望抽,“玉大人,你說(shuō)我怎么就攤上這事履婉∶焊荩” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵毁腿,是天一觀的道長(zhǎng)辑奈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)已烤,這世上最難降的妖魔是什么鸠窗? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮胯究,結(jié)果婚禮上稍计,老公的妹妹穿的比我還像新娘。我一直安慰自己唐片,他們只是感情好丙猬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布涨颜。 她就那樣靜靜地躺著,像睡著了一般茧球。 火紅的嫁衣襯著肌膚如雪庭瑰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天抢埋,我揣著相機(jī)與錄音弹灭,去河邊找鬼。 笑死揪垄,一個(gè)胖子當(dāng)著我的面吹牛穷吮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饥努,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捡鱼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酷愧?” 一聲冷哼從身側(cè)響起驾诈,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溶浴,沒(méi)想到半個(gè)月后乍迄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡士败,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年闯两,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谅将。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漾狼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戏自,到底是詐尸還是另有隱情邦投,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布擅笔,位于F島的核電站志衣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猛们。R本人自食惡果不足惜念脯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弯淘。 院中可真熱鬧绿店,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至转培,卻和暖如春恶导,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浸须。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工惨寿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人删窒。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓裂垦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肌索。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕉拢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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