01.垃圾回收機(jī)制

垃圾回收基礎(chǔ)

JVM能自動(dòng)對(duì)內(nèi)存中已死亡或長(zhǎng)時(shí)間未使用的對(duì)象進(jìn)行清除和回收急迂,從而有效提高內(nèi)存空間利用率鸽嫂。
但如果完全交由JVM來回收對(duì)象就會(huì)增加回收性能的不確定性米罚,所以面對(duì)特定的業(yè)務(wù)場(chǎng)景就需要人為介入來實(shí)現(xiàn)垃圾回收的調(diào)優(yōu)。比如說對(duì)內(nèi)存要求苛刻的情況下,需要提高對(duì)象的回收效率层亿;在CPU使用率高的情況下桦卒,就需要降低并發(fā)時(shí)垃圾回收的頻率。所以說垃圾回收調(diào)優(yōu)是一項(xiàng)必備技能匿又。學(xué)習(xí)調(diào)優(yōu)技能前我們要先了解一下垃圾回收機(jī)制方灾。

從以下三個(gè)角度來了解垃圾回收機(jī)制

1. 回收發(fā)生在哪里

JVM的內(nèi)存區(qū)域主要有5個(gè)部分:方法區(qū)、堆碌更,虛擬機(jī)棧迎吵、本地方法棧、程序計(jì)數(shù)器针贬。

其中線程共享的是方法區(qū)和击费,這兩個(gè)區(qū)域是垃圾回收的關(guān)注的區(qū)域。方法區(qū)主要回收的是廢棄的常量和無用類桦他。主要是對(duì)象的回收蔫巩,堆是我們要關(guān)注的垃圾回收的重點(diǎn)區(qū)域

線程隔離的是虛擬機(jī)棧快压、本地方法棧和程序計(jì)數(shù)器圆仔,他們是線程私有的,會(huì)隨著線程的創(chuàng)建而創(chuàng)建蔫劣,銷毀而銷毀坪郭,所以這三個(gè)區(qū)域的內(nèi)存分配和銷毀都是具有確定性的,因此不是垃圾回收關(guān)注的重點(diǎn)脉幢。

2. (堆中的)對(duì)象在什么時(shí)候可以被回收

對(duì)象不再被引用時(shí)即可被回收歪沃。
如何判斷對(duì)象不再被引用?

  • 引用計(jì)數(shù)法
    通用一個(gè)對(duì)象的引用計(jì)數(shù)器來判斷是否被引用嫌松。每當(dāng)被引用時(shí)沪曙,計(jì)數(shù)器加一,引用失效時(shí)萎羔,計(jì)數(shù)器減一液走,當(dāng)計(jì)數(shù)器為0時(shí),說明不再被引用贾陷,可以被回收了缘眶。
    他存在一個(gè)問題,存在對(duì)象之間相互循環(huán)引用的問題髓废,這種情況下相互引用的兩個(gè)對(duì)象的計(jì)數(shù)器都是1巷懈,垃圾回收器就無法判斷進(jìn)行回收了。而他倆都不是被其他對(duì)象引用的對(duì)象瓦哎,所以說也是垃圾砸喻。由于循環(huán)引用的問題柔逼,主流的垃圾回收器是不使用這種回收算法的。
  • 可達(dá)性分析算法
    以HotSpot為例割岛,它使用了可達(dá)性分析算法愉适。這種算法的基礎(chǔ)依賴于一些叫做gc roots的對(duì)象。
    gc roots對(duì)象虛擬機(jī)棧中引用的對(duì)象癣漆,方法區(qū)中靜態(tài)屬性引用的對(duì)象维咸,方法區(qū)中常量引用的對(duì)象,本地方法棧中JNI引用的對(duì)象惠爽。
    以這些gc roots對(duì)象為起點(diǎn)癌蓖,向下搜索所有走過的路徑,那些能與gc roots對(duì)象聯(lián)通的對(duì)象就是存活對(duì)象婚肆。gc roots到該節(jié)點(diǎn)不可達(dá)租副,即為垃圾對(duì)象,可以被回收较性。

3.怎樣回收

垃圾回收算法

  • 標(biāo)記清除算法
    先對(duì)可回收的對(duì)象進(jìn)行標(biāo)記用僧,然后再清理掉。
    他有一個(gè)很嚴(yán)重的問題赞咙,會(huì)產(chǎn)生大量?jī)?nèi)存碎片導(dǎo)致我們無法申請(qǐng)到一個(gè)比較大的連續(xù)的內(nèi)存空間责循。
  • 復(fù)制算法
    是標(biāo)記清除算法演進(jìn)而來,解決了內(nèi)存碎片的問題攀操。
    他將內(nèi)存空間分為兩塊院仿,每次都使用其中的一塊,當(dāng)一塊使用完速和,就將上面還活著的對(duì)象復(fù)制到另一塊內(nèi)存上歹垫,然后把已使用的內(nèi)存一次全部清除掉從而保證內(nèi)存空間的連續(xù)可用。
    它也有一個(gè)明顯的缺點(diǎn)健芭,就是把內(nèi)存空間拆分成兩塊县钥。如果你有一個(gè)10g的內(nèi)存秀姐,那你能分配的最大單個(gè)對(duì)象就只有5g慈迈。
  • 標(biāo)記整理算法
    他的標(biāo)記過程與標(biāo)記清除算法一樣,但回收時(shí)不會(huì)直接對(duì)可回收對(duì)象進(jìn)行回收清理省有,而是讓所有存活的對(duì)象都向一端移動(dòng)痒留,然后再清理掉端邊界以外的區(qū)域。
    他也有一個(gè)致命缺點(diǎn)蠢沿,就是效率問題伸头。他對(duì)內(nèi)存變動(dòng)更頻繁,需要整理所有存活對(duì)象的引用地址舷蟀,效率比復(fù)制算法差很多恤磷。
  • 分代收集算法
    在融合了以上三種算法后誕生面哼。他其實(shí)是一套組合拳。根據(jù)對(duì)象存活周期的不同扫步,將Java堆劃分為新生代和老年代魔策。根據(jù)各個(gè)年代的特點(diǎn)使用最適合的收集算法。在新生代河胎,每次回收需要有大批對(duì)象死去闯袒,只有少量存活,就使用三種算法中效率最高的復(fù)制算法了游岳。而老年代政敢,由于存活對(duì)象比例比較高,沒有額外空間進(jìn)行分配擔(dān)保胚迫,就必須使用標(biāo)記清理算法標(biāo)記整理算法來回收喷户。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市访锻,隨后出現(xiàn)的幾起案子摩骨,更是在濱河造成了極大的恐慌,老刑警劉巖朗若,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恼五,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哭懈,警方通過查閱死者的電腦和手機(jī)灾馒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遣总,“玉大人睬罗,你說我怎么就攤上這事⌒癯猓” “怎么了容达?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)垂券。 經(jīng)常有香客問我花盐,道長(zhǎng),這世上最難降的妖魔是什么菇爪? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任算芯,我火速辦了婚禮,結(jié)果婚禮上凳宙,老公的妹妹穿的比我還像新娘熙揍。我一直安慰自己,他們只是感情好氏涩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布届囚。 她就那樣靜靜地躺著有梆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪意系。 梳的紋絲不亂的頭發(fā)上淳梦,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音昔字,去河邊找鬼爆袍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛作郭,可吹牛的內(nèi)容都是我干的陨囊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夹攒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜘醋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咏尝,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤压语,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后编检,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胎食,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年允懂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厕怜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕾总,死狀恐怖粥航,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情生百,我是刑警寧澤递雀,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蚀浆,受9級(jí)特大地震影響缀程,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜡坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一杠输、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秕衙,春花似錦、人聲如沸僵刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至勇吊,卻和暖如春曼追,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汉规。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工礼殊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人针史。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓晶伦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親啄枕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婚陪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 前言 在前面的文章中,介紹了JVM內(nèi)存模型分為:堆區(qū)频祝、虛擬機(jī)棧泌参、方法區(qū)、本地方法區(qū)和程序計(jì)數(shù)器常空,其中堆區(qū)是JVM中...
    千鋒陳老師閱讀 207評(píng)論 0 0
  • 當(dāng)需要排查各種內(nèi)存溢出沽一,內(nèi)存泄漏等問題時(shí),當(dāng)垃圾收集成為系統(tǒng)達(dá)到更高并發(fā)的瓶頸時(shí)漓糙,我們有必要深入GC的原理锯玛。 常見...
    Real_man閱讀 622評(píng)論 0 1
  • JVM垃圾回收(GC)模型 垃圾判斷算法 GC算法 垃圾收集器的實(shí)現(xiàn)和選擇 垃圾判斷算法 引用計(jì)數(shù)法(Refere...
    r09er閱讀 396評(píng)論 0 0
  • 一、垃圾回收機(jī)制的基本概念 1.什么是垃圾回收兼蜈? Garbage Collection 垃圾收集攘残。這里所謂的垃圾指...
    L_又不是不能用閱讀 1,767評(píng)論 0 0
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒为狸。表情可以傳達(dá)很多信息歼郭。高興了當(dāng)然就笑了,難過就哭了辐棒。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,013評(píng)論 2 7