JVM學(xué)習(xí)之HotSpot虛擬機(jī)中的垃圾收集器

垃圾收集器

如果說(shuō)收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)。
下面是Hotspot 虛擬機(jī)包含的所有收集器:

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

Serial

Serial.jpg
  • 特點(diǎn):是最基本、發(fā)展歷史最悠久的收集器。這是一個(gè)單線程收集器。但它的“單線程”的意義并不僅僅說(shuō)明它只會(huì)使用一個(gè)CPU或一條收集線程去完成垃圾收集工作,更重要的是它在進(jìn)行垃圾收集時(shí),必須暫停其他所有的工作線程,直到它收集結(jié)束。
  • 應(yīng)用年代:新生代
  • 采用算法:復(fù)制算法
  • 應(yīng)用:是虛擬機(jī)運(yùn)行在Client模式下的默認(rèn)新生代收集器。
  • 優(yōu)勢(shì):簡(jiǎn)單而高效(與其他收集器的單線程比),對(duì)于限定單個(gè)CPU的環(huán)境來(lái)說(shuō),Serial收集器由于沒(méi)有線程交互的開銷,專心做垃圾收集自然可以獲得最高的單線程效率。
  • 缺點(diǎn):Stop the world!

ParNew

ParNew
  • 特點(diǎn):ParNew收集器其實(shí)就是Serial收集器的多線程版本
  • 應(yīng)用年代:新生代
  • 采用算法:復(fù)制算法
  • 應(yīng)用:CPU較多
  • 優(yōu)勢(shì):除了Serial收集器外,目前只有它能與CMS收集器配合工作。
  • 缺點(diǎn):在單CPU環(huán)境,表現(xiàn)甚至不如Serial

Parallel Scavenge

Para
  • 特點(diǎn):Parallel Scavenge收集器的目標(biāo)是達(dá)到一個(gè)可控制的吞吐量。(吞吐量 = 運(yùn)行用戶代碼時(shí)間 + 垃圾收集時(shí)間)。他的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶線程的停頓時(shí)間。還可以根據(jù)當(dāng)前系統(tǒng)的運(yùn)行情況收集性能監(jiān)測(cè)信息,動(dòng)態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時(shí)間或者最大吞吐量。
  • 應(yīng)用年代:新生代
  • 采用算法:復(fù)制算法
  • 優(yōu)勢(shì):同特點(diǎn)

Serial Old

  • 特點(diǎn):Serial 的老年版本
  • 應(yīng)用年代:老年代
  • 采用算法:標(biāo)記-整理
  • 應(yīng)用:與Parallel Scavenge收集器搭配使用;作為CMS收集器的后備預(yù)案,在并發(fā)收集發(fā)生Conurrent Mode Failure 使用。
  • 優(yōu)勢(shì):

Parallel Old

  • 特點(diǎn):Parallel Old是Parallel Scavenge收集器的老年代版本
  • 應(yīng)用年代:老年代
  • 采用算法:標(biāo)記-整理
  • 應(yīng)用:注重吞吐量以及CPU資源敏感的場(chǎng)合,都可以優(yōu)先考慮Parallel

CMS(重點(diǎn))

  • 特點(diǎn):是HotSpot虛擬機(jī)中第一款真正意義上的并發(fā)收集器,它第一次實(shí)現(xiàn)了讓垃圾收集線程與用戶線程同時(shí)工作。他的關(guān)注點(diǎn)在于盡可能地縮短垃圾收集時(shí)用戶線程的停頓時(shí)間
  • 應(yīng)用年代:老年代
  • 采用算法:標(biāo)記-清除
  • 應(yīng)用場(chǎng)景:大部分集中在互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端上的 Java 應(yīng)用
  • 優(yōu)勢(shì):停頓時(shí)間短

它的運(yùn)作過(guò)程相對(duì)來(lái)說(shuō)較為復(fù)雜,分為 4 個(gè)步驟
初始標(biāo)記、并發(fā)標(biāo)記、重新標(biāo)記、并發(fā)清除

cms

其中,初始標(biāo)記,重新標(biāo)記這兩個(gè)步驟仍然需要“Stop The World”。初始標(biāo)記僅僅只標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快。并發(fā)標(biāo)記階段就是進(jìn)行GC Roots Tracing的過(guò)程。
重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記幾率,這個(gè)階段的停頓時(shí)間一般會(huì)比初始標(biāo)記階段稍長(zhǎng),但遠(yuǎn)比并發(fā)標(biāo)記時(shí)間短。
整個(gè)過(guò)程耗時(shí)最長(zhǎng)的階段是并發(fā)標(biāo)記,并發(fā)清除過(guò)程,但這兩個(gè)過(guò)程可以和用戶線程一起工作。

缺點(diǎn)

  • CMS收集器對(duì)CPU資源非常敏感。在并發(fā)階段,它雖然不會(huì)導(dǎo)致用戶線程停頓,但是會(huì)因?yàn)檎加昧艘徊糠志€程(或者說(shuō)CPU資源)而導(dǎo)致應(yīng)用程序變慢,總吞吐量會(huì)降低。
  • CMS收集器無(wú)法處理浮動(dòng)垃圾,可能出現(xiàn)“Conurrent Mode Failure”失敗而導(dǎo)致另一次 Full GC的產(chǎn)生。由于 CMS 并發(fā)清理階段用戶線程還在運(yùn)行著,伴隨程序運(yùn)行自然就還會(huì)產(chǎn)生新的垃圾,這一部分垃圾出現(xiàn)在標(biāo)記過(guò)程之后,CMS無(wú)法在檔次收集中處理掉它們,只好留待下一次GC時(shí)再清理掉。這部分垃圾就稱為“浮動(dòng)垃圾”。因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進(jìn)行收集,需要預(yù)留一部分空間提供并發(fā)收集時(shí)程序運(yùn)作使用。在JDK1.5的默認(rèn)設(shè)置下,CMS 收集器當(dāng)老年代使用了 68% 的空間后就會(huì)被激活。如果預(yù)留空間無(wú)法滿足程序需要,就會(huì)出現(xiàn)一次“Concurrent Mode Failure”失敗,這時(shí)虛擬機(jī)將啟動(dòng)后備預(yù)案Serial Old。
  • CMS是一款基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器,所以會(huì)有大量空間碎片問(wèn)題。

更多Java 虛擬機(jī)學(xué)習(xí)

歡迎關(guān)注我的個(gè)人博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容