【架構(gòu)師干貨】用圖來解釋 Java 垃圾回收機制,程序員秒懂唾糯。

【架構(gòu)師干貨】用來解釋?Java 垃圾回收機制嵌溢,程序員秒懂。




Java編程中自動垃圾回收是什么坟冲?


通俗的來講自動垃圾回收是一種在堆內(nèi)存中找出哪些對象在被使用侄榴,或者還有一些對象沒被使用,并且將沒用的機制自動刪除钉凌。


所謂使用中的對象(已引用對象),指的是程序中有指針指向的對象栽惶;而未使用中的對象(未引用對象)宪迟,則沒有被任何指針給指向啊片,因此占用的內(nèi)存也可以被回收掉。


在用C 之類的編程語言時瞒窒,程序員需要自己手動分配和釋放內(nèi)存拔稳。而 Java 不一樣挺庞,它有垃圾回收器,釋放內(nèi)存由回收器負(fù)責(zé)拆檬。本文接下來將介紹垃圾回收機制的基本過程洪己。


第一步:標(biāo)記


垃圾回收的第一步是標(biāo)記。垃圾回收器此時會找出哪些內(nèi)存在使用中竟贯,還有哪些不是答捕。




上圖中,藍色表示已引用對象屑那,橙色表示未引用對象拱镐。垃圾回收器要檢查完所有的對象,才能知道哪些有被引用持际,哪些沒沃琅。如果系統(tǒng)里所有的對象都要檢查,那這一步可能會相當(dāng)耗時間选酗。關(guān)注Java技術(shù)棧微信公眾號阵难,回復(fù):JVM46岳枷,可以獲取一份超全 JVM 調(diào)優(yōu)攻略芒填。


第二步:清除


這一步會刪掉標(biāo)記出的未引用對象呜叫。



內(nèi)存分配器會保留指向可用內(nèi)存的引用,以供分配新對象殿衰。


壓縮


為了提升性能朱庆,刪除了未引用對象后,還可以將剩下的已引用對象放在一起(壓縮)闷祥,這樣就能更簡單快捷地分配新對象了娱颊。



為什么需要分代垃圾收集?


之前說過凯砍,逐一標(biāo)記和壓縮Java 虛擬機里的所有對象非常低效:分配的對象越多箱硕,垃圾回收需時就越久。不過悟衩,根據(jù)統(tǒng)計剧罩,大部分的對象,其實用沒多久就不用了座泳。


來看個例子吧惠昔。(下圖中,豎軸代表已分配的字節(jié)挑势,而橫軸代表程序運行時間)



上圖可見镇防,存活(沒被釋放)的對象隨運行時間越來越少。而圖中左側(cè)的那些峰值潮饱,也表明了大部分對象其實都挺短命的来氧。


JVM 分代


根據(jù)之前的規(guī)律,就可以用來提升JVM 的效率了香拉。方法是饲漾,把堆分成幾個部分(就是所謂的分代),分別是新生代缕溉、老年代考传,以及永生代。



新對象會被分配在新生代內(nèi)存证鸥。一旦新生代內(nèi)存滿了僚楞,就會開始對死掉的對象,進行所謂的小型垃圾回收過程枉层。一片新生代內(nèi)存里泉褐,死掉的越多,回收過程就越快鸟蜡;至于那些還活著的對象膜赃,此時就會老化,并最終老到進入老年代內(nèi)存揉忘。


Stop the World 事件 —— 小型垃圾回收屬于一種叫 "Stop the World" 的事件跳座。在這種事件發(fā)生時端铛,所有的程序線程都要暫停,直到事件完成(比如這里就是完成了所有回收工作)為止疲眷。


老年代用來保存長時間存活的對象禾蚕。通常,設(shè)置一個閾值狂丝,當(dāng)達到該年齡時换淆,年輕代對象會被移動到老年代。最終老年代也會被回收几颜。這個事件成為Major GC倍试。


Major GC 也會觸發(fā)STW(Stop the World)。通常蛋哭,Major GC會慢很多易猫,因為它涉及到所有存活對象。所以具壮,對于響應(yīng)性的應(yīng)用程序准颓,應(yīng)該盡量避免Major GC。還要注意棺妓,Major GC的STW的時長受年老代垃圾回收器類型的影響攘已。


永久代包含JVM用于描述應(yīng)用程序中類和方法的元數(shù)據(jù)。永久代是由JVM在運行時根據(jù)應(yīng)用程序使用的類來填充的怜跑。此外样勃,Java SE類庫和方法也存儲在這里。


如果JVM發(fā)現(xiàn)某些類不再需要性芬,并且其他類可能需要空間峡眶,則這些類可能會被回收。


世代垃圾收集過程


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


首先俊庇,將任何新對象分配給eden 空間狮暑。兩個 survivor 空間都是空的。



當(dāng)eden 空間填滿時辉饱,會觸發(fā)輕微的垃圾收集搬男。



引用的對象被移動到第一個survivor 空間。清除 eden 空間時彭沼,將刪除未引用的對象缔逛。



在下一次Minor GC中,Eden區(qū)也會做同樣的操作。刪除未被引用的對象褐奴,并將被引用的對象移動到Survivor區(qū)按脚。然而,這里歉糜,他們被移動到了第二個Survivor區(qū)(S1)。


此外望众,第一個Survivor區(qū)(S0)中匪补,在上一次Minor GC幸存的對象,會增加年齡烂翰,并被移動到S1中夯缺。待所有幸存對象都被移動到S1后,S0和Eden區(qū)都會被清空甘耿。注意踊兜,Survivor區(qū)中有了不同年齡的對象。



在下一次Minor GC中佳恬,會重復(fù)同樣的操作捏境。不過,這一次Survivor區(qū)會交換毁葱。被引用的對象移動到S0,垫言。幸存的對象增加年齡。Eden區(qū)和S1被清空倾剿。



此幻燈片演示了promotion筷频。在較小的GC之后,當(dāng)老化的物體達到一定的年齡閾值(在該示例中為8)時前痘,它們從年輕一代晉升到老一代凛捏。



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



?所以這幾乎涵蓋了年輕一代的整個過程坯癣。最終,將主要對老一代進行GC最欠,清理并最終壓縮該空間坡锡。



專注于Java架構(gòu)師技術(shù)分享,撩我免費送Java全套架構(gòu)師晉級資料

(Java架構(gòu)師交流企*-**-*鵝*-*裙*-*:445*-**-*820*-**-*908

?【架構(gòu)師干貨】用來解釋?Java 垃圾回收機制窒所,程序員秒懂鹉勒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吵取,隨后出現(xiàn)的幾起案子禽额,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脯倒,死亡現(xiàn)場離奇詭異实辑,居然都是意外死亡,警方通過查閱死者的電腦和手機藻丢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門剪撬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悠反,你說我怎么就攤上這事残黑。” “怎么了斋否?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵梨水,是天一觀的道長。 經(jīng)常有香客問我茵臭,道長疫诽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任旦委,我火速辦了婚禮奇徒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缨硝。我一直安慰自己逼龟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布追葡。 她就那樣靜靜地躺著腺律,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宜肉。 梳的紋絲不亂的頭發(fā)上匀钧,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音谬返,去河邊找鬼之斯。 笑死,一個胖子當(dāng)著我的面吹牛遣铝,可吹牛的內(nèi)容都是我干的佑刷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酿炸,長吁一口氣:“原來是場噩夢啊……” “哼瘫絮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起填硕,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤麦萤,失蹤者是張志新(化名)和其女友劉穎鹿鳖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壮莹,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡翅帜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了命满。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝滴。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胶台,靈堂內(nèi)的尸體忽然破棺而出歼疮,到底是詐尸還是另有隱情,我是刑警寧澤概作,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布腋妙,位于F島的核電站默怨,受9級特大地震影響讯榕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匙睹,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一愚屁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痕檬,春花似錦霎槐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唁桩,卻和暖如春闭树,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荒澡。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工报辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人单山。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓碍现,卻偏偏與公主長得像,于是被迫代替她去往敵國和親米奸。 傳聞我的和親對象是個殘疾皇子昼接,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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