JVM垃圾回收機制

程序計數(shù)器吸占、虛擬機棧诫钓、本地方法棧3個區(qū)域隨線程而生,隨線程而滅菌湃,內(nèi)存分配和內(nèi)存回收都具備確定性,所以不需要過多考慮這幾個區(qū)域的回收問題骤坐。這里我們主要探究Java堆的回收機制下愈。

如何判斷對象可被回收

  1. 引用計數(shù)機制
    給對象添加一個引用計數(shù)器纽绍,每當有一個地方引用它時势似,計數(shù)器值就加1;當引用失效時障簿,計數(shù)器值就減1栅迄。
    該算法實現(xiàn)簡單,判定效率高毅舆,但因為無法解決對象之間相互循環(huán)引用的問題,現(xiàn)今主流的Java虛擬機并沒有選用它來管理內(nèi)存岂津。

  2. 可達性分析算法
    通過一系列的稱為“GC Roots”的對象作為起始點悦即,從這些點開始向下搜索,搜索所走過的路徑稱為引用鏈盐欺,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象時不可用的魔种。

Java對象中粉洼,可作為GC Roots的對象:
1. 虛擬機棧中引用的對象叶摄。
2. 方法區(qū)中類靜態(tài)屬性引用的對象安拟。
3. 方法區(qū)中常量引用的對象。
4. 本地方法棧中JNI引用的對象糠赦。
  1. 一定會被回收嗎?
    在可達性分析算法中淌山,即使被判斷為不可達的對象顾瞻,也不一定會被回收泼疑。如果一個對象實現(xiàn)了finalize()方法荷荤,并且該方法還沒有被虛擬機調(diào)用過,則在回收之前會調(diào)用此方法会油,若在此方法中袱蚓,將該對象與任何一個引用鏈上的對象關(guān)聯(lián)几蜻,則在finalize()調(diào)用后可以成功的變成可達的對象,從而避免被回收梭稚。

  2. 方法區(qū)的回收
    雖然說方法區(qū)回收的比率非常低,但也不是不能回收忱屑。
    在常量池中暇昂,如果某個常量不被任何地方引用,則可以被清理出常量池急波。
    判斷一個類是否是“無用的類”的條件苛刻許多,需要同時滿足以下三個條件:

1. 該類所有的實例都已經(jīng)被回收名段。
2. 加載該類的ClassLoader已經(jīng)被回收。
3. 該類對應的java.lang.Class對象沒有在任何地方被引用伸辟,無法在任何地方通過反射訪問該類的方法。

一般情況下我們不需要太關(guān)心方法區(qū)的回收問題窃蹋,但如果項目中大量使用到反射静稻、動態(tài)代理等頻繁自定義ClassLoader的場景則需要虛擬機具備類卸載的功能,以保證不會內(nèi)存溢出。

垃圾收集算法

  1. 標記 - 清除算法(Mark-Sweep)
    最基礎(chǔ)的收集算法膝捞。首先標出所有需要回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象晃酒。
    該算法有兩個不足之處:一個是效率問題,標記和清除兩個過程的效率都不高;另一個是標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片摧茴,當遇到需要分配較大內(nèi)存的對象時,會因為無法找到足夠的連續(xù)內(nèi)存而提前觸發(fā)一次GC娃豹。

  2. 復制算法(Copying)
    該算法將可用的內(nèi)存安容量劃分為大小相等的兩塊购裙,每次只使用其中的一塊,當這一塊的內(nèi)存用完了躏率,就將還存活的對象復制到另一塊上面,然后再把以使用過的內(nèi)存空間一次性清理掉蓬抄。
    該算法的代價是將可用內(nèi)存縮小為了原來的一半夯到。
    但是實際情況中我們并不會真正按照1:1來劃分內(nèi)存空間,有研究表明新生代中98%的對象都是“朝生夕死”的黄娘,所以實際情況中將內(nèi)存空間分為一塊較大的Eden空間和兩塊較小的Survivor空間克滴,每次使用Eden和其中一塊Survivor优床,當回收時將Eden和Survivor中還存活的對象復制到另一塊上,然后清除掉Eden和剛才用過的Survivor空間着帽。HotSpot虛擬機默認Eden和Survivor的比例是8:1移层。這樣只需要付出10%的內(nèi)存,就能在絕大部分情況下順利完成回收工作观话,當Survivor空間不夠用時,則需要依賴其他內(nèi)存進行分配擔保灵迫。

  3. 標記 - 整理算法(Mark - Compact)
    復制算法不適用于回收率低的情況晦溪,所以老年代采用了“標記 - 整理”算法,標記過程依然與“標記 - 清除”算法一樣三圆,而后續(xù)步驟則是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存修噪。

  4. 分代收集算法(Generational Collection)
    該算法根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊度气,一般是把Java堆氛圍新生代和老年代膨报,新生代的回收率非常高,則選用復制算法现柠;老年代的對象存活率高、沒有額外的空間對它進行分配擔保比然,就必須使用“標記 - 清理”或者“標記 - 整理”算法來進行回收周循。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末万俗,一起剝皮案震驚了整個濱河市饮怯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌库倘,老刑警劉巖论矾,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饱亿,居然都是意外死亡,警方通過查閱死者的電腦和手機路捧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門传黄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人章姓,你說我怎么就攤上這事识埋。” “怎么了窒舟?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵惠豺,是天一觀的道長。 經(jīng)常有香客問我洁墙,道長,這世上最難降的妖魔是什么捺弦? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮幽崩,結(jié)果婚禮上寞钥,老公的妹妹穿的比我還像新娘。我一直安慰自己凑耻,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布类缤。 她就那樣靜靜地躺著邻吭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囱晴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天驮瞧,我揣著相機與錄音枯芬,去河邊找鬼。 笑死狂魔,一個胖子當著我的面吹牛淫痰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播待错,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼朗鸠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烛占?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤犹菇,失蹤者是張志新(化名)和其女友劉穎芽卿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卸例,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡筷转,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锭汛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袭蝗。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖到腥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情廉侧,我是刑警寧澤篓足,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站连舍,受9級特大地震影響涩哟,放射性物質(zhì)發(fā)生泄漏索赏。R本人自食惡果不足惜贴彼,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一器仗、第九天 我趴在偏房一處隱蔽的房頂上張望童番。 院中可真熱鬧,春花似錦剃斧、人聲如沸忽你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糟秘。三九已至简逮,卻和暖如春蚌堵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背督赤。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工泻蚊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人性雄。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓秒旋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迁筛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 一尉桩、概述: 本文作為大數(shù)據(jù)基礎(chǔ)的Java部分贪庙,上一篇說明了Linux的常用命令,今天學習了Java的高級特性止邮,我們...
    慕久久閱讀 747評論 1 5
  • 1. 概述 在Java內(nèi)存區(qū)域里講了Java的內(nèi)存運行時數(shù)據(jù)區(qū)域分為如下5個部分 程序計數(shù)器(Program Co...
    謝樸歡閱讀 282評論 0 0
  • 最近比較粗淺的接觸了一下JVM,發(fā)現(xiàn)有很多東西還是非常有意思的良哲,并不像之前的印象助隧,覺得JVM相關(guān)的東西生澀難懂滑沧。本...
    UncleYee閱讀 1,041評論 1 12
  • 1. 前言 網(wǎng)上關(guān)于jvm gc的文章有很多,寫這篇文章不是有什么新東西要講滓技,主要原因是工作時也偶爾碰到比如ful...
    aaron1993閱讀 1,203評論 0 0
  • 尊敬的各位領(lǐng)導令漂,老師們大家下午好膝昆!今天我演講的題目是《責任擔當叠必,愛心育人,立德樹人》纬朝。曾在兒時,我便希望...
    劉佳穎演講稿閱讀 1,012評論 1 5