理解JVM(七):垃圾回收器

一些概念

并行(Parallel)

指多條垃圾收集線程并行工作,但此時(shí)用戶(hù)線程仍然處于等待狀態(tài)悯舟。

并發(fā)(Concurrent)

指用戶(hù)線程與垃圾收集線程同時(shí)執(zhí)行(但不一定是并行的担租,可能會(huì)交替執(zhí)行),用戶(hù)程序在繼續(xù)運(yùn)行抵怎,而垃圾收集程序運(yùn)行于另一個(gè)CPU上奋救。

吞吐量

CPU用于運(yùn)行用戶(hù)代碼的時(shí)間與CPU總消耗時(shí)間的比值,即吞吐量=運(yùn)行用戶(hù)代碼時(shí)間/(運(yùn)行用戶(hù)代碼時(shí)間+垃圾收集時(shí)間)反惕。虛擬機(jī)總共運(yùn)行了100分鐘尝艘,其中垃圾收集花掉1分鐘,那吞吐量就是99%承璃。

HotSpot虛擬機(jī)的垃圾回收器

Serial

  • 最基本的單線程垃圾收集器利耍。使用一個(gè)CPU或一條收集線程去執(zhí)行垃圾收集工作。
  • 工作時(shí)會(huì)Stop The World,暫停所有用戶(hù)線程隘梨,造成卡頓程癌。適合運(yùn)行在Client模式下的虛擬機(jī)。
  • 用作新生代收集器轴猎,復(fù)制算法嵌莉。

ParNew

  • Serial收集器的多線程版本,和Serial的唯一區(qū)別就是使用了多條線程去垃圾收集捻脖。
  • 除了Serial锐峭,只有它可以和CMS搭配使用的收集器。
  • 用作新生代收集器可婶,復(fù)制算法沿癞。

Parallel Scavenge

  • 用作新生代收集器,復(fù)制算法矛渴。
  • 關(guān)注高吞吐量椎扬,可以高效率地利用CPU時(shí)間,盡快完成程序的運(yùn)算任務(wù)具温,主要適合在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)蚕涤。
  • Parallel Scavenge收集器提供了兩個(gè)參數(shù)用于精確控制吞吐量,分別是控制最大垃圾收集停頓時(shí)間的-XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)铣猩。

Serial Old

  • Serial收集器的老年代版本揖铜,單線程,標(biāo)記-整理 算法达皿。
  • 一般用于Client模式的虛擬機(jī)天吓。
  • 當(dāng)虛擬機(jī)是Server模式時(shí),有2個(gè)用途:一種用途是在JDK 1.5以及之前的版本中與Parallel Scavenge收集器搭配使用 鳞绕,另一種用途就是作為CMS收集器的后備預(yù)案失仁,在并發(fā)收集發(fā)生Concurrent Mode Failure時(shí)使用。

Parallel Old

  • Parallel Scavenge收集器的老年代版本们何,使用多線程和 標(biāo)記-整理 算法萄焦。在JDK 1.6中開(kāi)始提供。
  • 在注重吞吐量的場(chǎng)合冤竹,配合Parallel Scavenge收集器使用拂封。

CMS(Concurrent Mark Sweep)

  • 一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。適合需要與用戶(hù)交互的程序鹦蠕,良好的響應(yīng)速度能提升用戶(hù)體驗(yàn)冒签。
  • 基于 標(biāo)記—清除 算法。適合作為老年代收集器钟病。
  • 收集過(guò)程分4步:
    • 初始標(biāo)記(CMS initial mark):只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象萧恕,速度很快刚梭,會(huì)Stop The World
    • 并發(fā)標(biāo)記(CMS concurrent mark):進(jìn)行GC Roots Tracing(可達(dá)性分析)的過(guò)程票唆。
    • 重新標(biāo)記(CMS remark):會(huì)Stop The World朴读。為了修正并發(fā)標(biāo)記期間因用戶(hù)程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間一般比初始標(biāo)記階段稍長(zhǎng)些走趋,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短衅金。
    • 并發(fā)清除(CMS concurrent sweep):回收內(nèi)存。
  • 耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除過(guò)程收集器線程都可以與用戶(hù)線程一起工作簿煌,所以時(shí)并發(fā)執(zhí)行的氮唯。
  • 缺點(diǎn):
    • 并發(fā)階段,雖然不會(huì)導(dǎo)致用戶(hù)線程暫停姨伟,但會(huì)占用一部分線程(CPU資源)惩琉,導(dǎo)致應(yīng)用變慢,吞吐量降低授滓。默認(rèn)啟動(dòng)收集線程數(shù)是(CPU數(shù)量+3)/4琳水。即當(dāng)CPU在4個(gè)以上時(shí),并發(fā)回收時(shí)垃圾收集線程不少于25%的CPU資源般堆,并且隨著CPU數(shù)量的增加而下降。但是當(dāng)CPU不足4個(gè)(譬如2個(gè))時(shí)诚啃,CMS對(duì)用戶(hù)程序的影響就可能變得很大淮摔。
    • 無(wú)法清除浮動(dòng)垃圾。并發(fā)清除階段始赎,用戶(hù)線程還在運(yùn)行和橙,還會(huì)產(chǎn)生新垃圾。這些垃圾不會(huì)在此次GC中被標(biāo)記造垛,只能等到下次GC被回收魔招。
    • 標(biāo)記-清除 算法會(huì)產(chǎn)生大量不連續(xù)內(nèi)存,導(dǎo)致分配大對(duì)象時(shí)內(nèi)存不夠五辽,提前觸發(fā)Full GC办斑。

G1

  • 在JDK1.7提供的先進(jìn)垃圾收集器。

  • 既適合新生代杆逗,也適合老年代乡翅。

  • 空間整合:使用 標(biāo)記-整理 算法,不產(chǎn)生碎片空間罪郊。

  • 整個(gè)Java堆被分為多個(gè)大小相同的的塊(region)蠕蚜。新生代和老年代不再是物理隔離的,而是一部分region塊組成的集合悔橄。

  • 可預(yù)測(cè)的停頓時(shí)間:估算每個(gè)region內(nèi)的垃圾可回收的空間以及回收需要的時(shí)間(經(jīng)驗(yàn)值)靶累,記錄在一個(gè)優(yōu)先列表中腺毫。收集時(shí),優(yōu)先回收價(jià)值最大的region挣柬,而不是在整個(gè)堆進(jìn)行全區(qū)域回收潮酒。這樣提高了回收效率,得名:Garbage-First凛忿。

  • 回收步驟:

    • 初始標(biāo)記(Initial Marking):只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象澈灼,并且修改TAMS(Next Top at Mark Start)的值,讓下一階段用戶(hù)程序并發(fā)運(yùn)行時(shí)店溢,能在正確可用的Region中創(chuàng)建新對(duì)象叁熔,這階段需要停頓線程,但耗時(shí)很短床牧。
    • 并發(fā)標(biāo)記(Concurrent Marking):進(jìn)行可達(dá)性分析荣回,找出存活對(duì)象,耗時(shí)長(zhǎng)戈咳,但可與用戶(hù)線程并發(fā)心软。
    • 最終標(biāo)記(Final Marking):修正并發(fā)標(biāo)記階段用戶(hù)線程運(yùn)行導(dǎo)致的變動(dòng)記錄。會(huì)Stop The World著蛙,但可以并行執(zhí)行删铃,時(shí)間不會(huì)很長(zhǎng)。
    • 篩選回收(Live Data Counting and Evacuation):根據(jù)每個(gè)region的回收價(jià)值和回收成本排序踏堡,根據(jù)用戶(hù)配置的GC停頓時(shí)間開(kāi)始回收猎唁。
  • 當(dāng)內(nèi)存很少的時(shí)候(存活對(duì)象占用大量空間),沒(méi)有足夠空間來(lái)復(fù)制對(duì)象顷蟆,會(huì)導(dǎo)致回收失敗诫隅。這時(shí)會(huì)保留被移動(dòng)過(guò)的對(duì)象和沒(méi)移動(dòng)的對(duì)象,只調(diào)整引用帐偎。失敗發(fā)生后逐纬,收集器認(rèn)為存活對(duì)象被移動(dòng)了,有足夠空間讓?xiě)?yīng)用程序使用削樊,于是用戶(hù)線程繼續(xù)工作豁生,等待下一次觸發(fā)GC。如果內(nèi)存不夠嫉父,就會(huì)觸發(fā)Full GC沛硅。

參考G1的詳細(xì)介紹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绕辖,隨后出現(xiàn)的幾起案子摇肌,更是在濱河造成了極大的恐慌,老刑警劉巖仪际,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件围小,死亡現(xiàn)場(chǎng)離奇詭異昵骤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肯适,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)变秦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人框舔,你說(shuō)我怎么就攤上這事蹦玫。” “怎么了刘绣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵樱溉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我纬凤,道長(zhǎng)福贞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任停士,我火速辦了婚禮挖帘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恋技。我一直安慰自己拇舀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布蜻底。 她就那樣靜靜地躺著你稚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朱躺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天搁痛,我揣著相機(jī)與錄音长搀,去河邊找鬼。 笑死鸡典,一個(gè)胖子當(dāng)著我的面吹牛源请,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彻况,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谁尸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了纽甘?” 一聲冷哼從身側(cè)響起良蛮,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悍赢,沒(méi)想到半個(gè)月后决瞳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體货徙,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年皮胡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痴颊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屡贺,死狀恐怖蠢棱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甩栈,我是刑警寧澤泻仙,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站谤职,受9級(jí)特大地震影響错森,放射性物質(zhì)發(fā)生泄漏削咆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谐鼎。 院中可真熱鬧,春花似錦鞋喇、人聲如沸芒填。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怠李。三九已至,卻和暖如春蛤克,著一層夾襖步出監(jiān)牢的瞬間捺癞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工构挤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓介,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓筋现,卻偏偏與公主長(zhǎng)得像唐础,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矾飞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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