JVM虛擬機第三章

在JAVA里,可作為GC Roots的對象包括:

1、虛擬機棧(棧幀中的本地變量表)中的引用的對象

2、方法區(qū)中的類靜態(tài)屬性引用的對象

3盖淡、方法區(qū)中的常量引用的對象

4、本地方法棧中JNI的引用的對象

無用的類判定條件

1凿歼、該類所有的實例都已經被回收

2褪迟、加載該類的classloader已經被回收

3、該類對應的java.lang.Class對象沒有在任何地方被引用答憔,無法在任何地方通過反射訪問該類的方法牵咙。

垃圾收集算法

標記-清除算法

分為標記和清除兩個階段,首先標記出所有需要回收的對象攀唯,在標記完成后統(tǒng)一回收掉所有被標記的對象洁桌。主要缺點有兩個:一個是效率問題,標記和清除過程的效率都不高侯嘀;另一個是空間問題另凌,標記清除后會產生大量不連續(xù)的內存碎片。

復制算法

為了解決效率問題戒幔,復制算法將內存容量劃分為大小相等的兩塊吠谢,每次只使用其中的一塊。當這一塊的內存用完了诗茎,就將還存活著的對象復制到另外一塊上面工坊,然后把已使用過的內存空間一次清理掉。將內存分為一塊較大的Eden空間和兩塊較小的survivor空間敢订,每次使用Eden和其中的一塊Survivor王污,當回收時,將Eden和Survivor中還存活著的對象一次性copy到另外一塊survivor空間上楚午,然后清理掉Eden和剛才使用過的Survivor空間昭齐。Eden:Survivor=8:1

標記-整理算法

復制收集算法在對象存活率較高時就要執(zhí)行較多的復制操作,效率將會變低矾柜,更關鍵的是如果不想浪費50%的空間阱驾,就需要額外的空間進行分配擔保,以應對被使用的內存中所有對象都100%存活的極端情況怪蔑,所以在老年代一般不能直接選用這種算法里覆。根據老年代的特點,有人提出標記-整理算法缆瓣,標記過程與標記-清除算法一樣喧枷,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活對象都向一端移動,然后直接清理掉端邊界以外的內存割去。

分代收集算法

根據新生代老年代的特點采用最適當的算法窟却。

垃圾收集器

垃圾收集器

Serial收集器

新生代的單線程收集器昼丑,用一個線程完成垃圾收集工作呻逆,在收集期間stop the world,直到它收集結束菩帝。Serial收集器對于 運行在client模式下是一個很好的選擇咖城。

Serial/Serial Old收集器運行示意圖

ParNew收集器

Serial收集器的多線程版本,除了使用多線程進行垃圾收集之外呼奢,其余行為包括Serial收集器可用的所有控制參數宜雀、收集算法、STW握础、對象分配規(guī)則辐董、回收策略都與Serial收集器完成一樣。運行在server模式下虛擬機首選的新生代收集器

ParNew/Serial Old收集器運行示意圖

Parallel Scavenge收集器

新生代收集器禀综,也是使用復制算法并行的多線程收集器简烘,它的關注點與其他收集器不同,CMS等關注點是盡可能縮短垃圾收集時用戶線程的停頓時間定枷,而Par Scavenge的目標則是達到一個可控制的吞吐量孤澎。吞吐量 = 運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)

Serial Old收集器

Serial收集器的老年代版本,單線程欠窒,使用標記-整理算法覆旭,Client模式下虛擬機使用。如果在server模式下岖妄,主要有兩大用途:一個是與Parallel Scavenge收集器搭配使用型将,另一個就是作為CMS收集器的后備預案,在并發(fā)收集發(fā)生concurrent mode failure時使用荐虐。

Parallel Old收集器

Parallel Scavenge收集器的老年代版本茶敏,多線程標記-整理算法


Parallel Scavenge/Parallel Old收集器運行示意圖

CMS收集器

一種以獲取最短回收停頓時間為目標的收集器。運行過程分為4個步驟

1缚俏、初始標記

2惊搏、并發(fā)標記

3、重新標記

4忧换、并發(fā)清除

其中初始標記地回、重新標記這兩步驟仍然需要STW,初始標記僅僅只是標記一下GC Roots能直接關聯(lián)到的對象腹暖,速度很快抢呆,并發(fā)標記階段就是進行GC Roots Tracing的過程,而重新標記則是為了修正并發(fā)標記期間,因用戶程序繼續(xù)運行而導致標記產生變動的那一部分對象的標記記錄碗暗,這個階段的停頓時間一般會比初始標記階段稍長一些颈将,但遠比并發(fā)標記的時間短。

由于整個過程中耗時最長的并發(fā)標記和并發(fā)清除過程中言疗,收集器都可以與用戶線程一起工作晴圾,所以總體來說CMS的內存回收過程是與用戶線程一起并發(fā)地執(zhí)行的。

CMS運行示意圖

G1收集器

G1收集器是基于標記-整理算法實現(xiàn)的收集器噪奄,不產生空間碎片死姚,能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒勤篮。G1將整個JAVA堆劃分為多個大小固定的獨立區(qū)域都毒,并且跟蹤這些區(qū)域里面的垃圾堆積程序,在后臺維護一個優(yōu)先表碰缔,每次根據允許的收集時間账劲,優(yōu)先回收垃圾最多的區(qū)域。

大多數情況下金抡,對象優(yōu)先在Eden分配瀑焦,當Eden區(qū)沒有足夠的空間進行分配時將發(fā)起一次Minor GC。

大對象直接進入老年代竟终,虛擬機提供了一個-XX:PretenureSizeThreshold參數蝠猬,令大于這個設置值的對象直接在老年代中分配 。這樣做的目的是避免在Eden及兩個Survivor區(qū)之間發(fā)生大量的內存拷貝统捶。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末榆芦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喘鸟,更是在濱河造成了極大的恐慌匆绣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件什黑,死亡現(xiàn)場離奇詭異崎淳,居然都是意外死亡,警方通過查閱死者的電腦和手機愕把,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門拣凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恨豁,你說我怎么就攤上這事嚣镜。” “怎么了橘蜜?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵菊匿,是天一觀的道長。 經常有香客問我,道長跌捆,這世上最難降的妖魔是什么徽职? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮佩厚,結果婚禮上姆钉,老公的妹妹穿的比我還像新娘。我一直安慰自己可款,他們只是感情好育韩,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布克蚂。 她就那樣靜靜地躺著闺鲸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埃叭。 梳的紋絲不亂的頭發(fā)上摸恍,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音赤屋,去河邊找鬼立镶。 笑死,一個胖子當著我的面吹牛类早,可吹牛的內容都是我干的媚媒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼涩僻,長吁一口氣:“原來是場噩夢啊……” “哼缭召!你這毒婦竟也來了?” 一聲冷哼從身側響起逆日,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤嵌巷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后室抽,有當地人在樹林里發(fā)現(xiàn)了一具尸體搪哪,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年坪圾,在試婚紗的時候發(fā)現(xiàn)自己被綠了晓折。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡兽泄,死狀恐怖漓概,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情已日,我是刑警寧澤垛耳,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響堂鲜,放射性物質發(fā)生泄漏栈雳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一缔莲、第九天 我趴在偏房一處隱蔽的房頂上張望哥纫。 院中可真熱鬧,春花似錦痴奏、人聲如沸蛀骇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擅憔。三九已至,卻和暖如春檐晕,著一層夾襖步出監(jiān)牢的瞬間暑诸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工辟灰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留个榕,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓芥喇,卻偏偏與公主長得像西采,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子继控,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容