垃圾收集器關(guān)系圖:
如果兩個(gè)收集器之間存在連線,就說明它們可以搭配使用。它們說在的區(qū)域則表示這個(gè)收集器屬于新生代收集器還是老年代收集器。其中Serial(串行)、Parallel(并行)
1、Serial收集器
? ? ? ? Serial收集器是最基礎(chǔ)、歷史最悠久的收集器,是HotSpot虛擬機(jī)新生代收集器的唯一選擇。這個(gè)收集器是一個(gè)單線程工作的收集器。這個(gè)收集器再進(jìn)行垃圾收集時(shí),必須停掉所有的工作線程,直到收集完成。這個(gè)停掉的工作是后臺(tái)自己執(zhí)行的,用戶并不知情。這個(gè)是我們無法接受的。
????????從上面的種種缺點(diǎn)看去似乎這個(gè)收集器已經(jīng)被時(shí)代拋棄,沒有優(yōu)點(diǎn)。但是它依舊是HotSpot虛擬機(jī)運(yùn)行再客戶端模式下默認(rèn)的新生代收集器。因?yàn)樗幸粋€(gè)很大的優(yōu)點(diǎn)簡(jiǎn)單而高效。再內(nèi)存環(huán)境受限的環(huán)境,它是所有收集器里面的額外內(nèi)存消耗最小的。一般來說分配給虛擬機(jī)管理的內(nèi)存一般不會(huì)特別大,對(duì)于幾十兆甚至一兩百兆的新生代,Serial垃圾收集器的停頓時(shí)間完全可以控制再可接受范圍。所以,?Serial收集器對(duì)于運(yùn)行在客戶端模式下的虛擬機(jī)來說是一個(gè)很好的選擇。
2、ParNew收集器
????????ParNew收集器實(shí)質(zhì)上是Serial收集器的多線程并行版本,出來可以同時(shí)多條線程進(jìn)行垃圾收集外,其余行為幾乎與Serial收集器一致。
? ? ? ? ?這個(gè)收集器明明沒有太大的創(chuàng)新為什么能有怎么重要的地位呢,那就是因?yàn)樗拇顧nCMS收集器。CMS第一款真正意義上支持并發(fā)的垃圾收集器,它首次 實(shí)現(xiàn)了讓垃圾收集線程與用戶線程同時(shí)工作。但這個(gè)收集器只能Serial和ParNew這兩個(gè)新生代收集器配合使用。這樣奠定了ParNew的地位。隨著G1收集器的產(chǎn)生,這一組合被逐漸取代,官方希望它能完全被G1所取代,ParNew和CMS從此只能互相搭配使用,再也沒有其他收集器能夠和它們配合了。也可以理解為從此以后,ParNew合并入CMS,成為它專門處理新生代的組成部分。ParNew可以說是HotSpot虛擬機(jī)中第一款退出歷史舞臺(tái)的垃圾收集器。
3、Parallel Scavenge收集器
????????Parallel Scavenge收集器是一款新生代收集器,它基于標(biāo)記復(fù)制算法實(shí)現(xiàn)。也是能夠并行收集的多線程收集器。它獨(dú)特的點(diǎn)在于它的注重點(diǎn)與其他收集器不同,CMS等收集器的關(guān)注點(diǎn)是盡可能的縮短垃圾收集時(shí)用戶線程的停頓時(shí)間,而Parallel Scavenge的注重點(diǎn)是一個(gè)可控的吞吐量。
注重停頓時(shí)間的垃圾收集器適合注重用戶良好體驗(yàn)的程序,而高吞吐量則是更高效的利用資源,盡快完成程序的運(yùn)算任務(wù),適合在后臺(tái)不需要過多交互的程序。
這個(gè)收集器提供了兩個(gè)參數(shù)用于精確控制吞吐量,分別是控制最大垃圾收集停頓時(shí)間 的-XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)。 -XX:
4、Serial Old收集器
? ? ? ? Serial Old是Serial收集器的老年版本,它是一個(gè)單線程收集器,使用標(biāo)記整理算法。這個(gè)收集器的主要作用是再客戶端模式下的HotSpot虛擬機(jī)使用。再服務(wù)端下一種是JDK5即以前與ParallelScavenge收集器搭配使用,另一種就是作為CMS收集器發(fā)生失敗時(shí)的后背預(yù)案。
5、Parallel Old收集器
? ? ? ? parallel Old是parallel Scavenge收集器的老年版本,支持多線程并發(fā)收集,基于標(biāo)記整理算法實(shí)現(xiàn)。出現(xiàn)在JDK6后。當(dāng)注重吞吐量或者處理器資源稀缺的時(shí)候,都會(huì)優(yōu)先考慮? ? ? ? ? ? ? ? parallel Scavenge+Parallel Old收集器這個(gè)組合。
6、CMS收集器 (并發(fā)收集、低停頓)
????????CMS(Concurrent Mark Sweep)收集器是以獲取最短回收停頓時(shí)間的為目標(biāo)的收集器。注重服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時(shí)間盡可能短,以給用戶更好的交互體驗(yàn)。這個(gè)收集器是基于標(biāo)記清除算法實(shí)現(xiàn)的。用于老年代的收集。
收集過程有四個(gè)階段:1、初始標(biāo)記? ? ? ? 2、并發(fā)標(biāo)記? ? ? ? 3、重新標(biāo)記? ? ? ? 4、并發(fā)清除
????????四個(gè)階段中初始標(biāo)記和重新標(biāo)記仍需要暫停所有的用戶線程(Stop The World),但為什么說這個(gè)收集器也暫停了所有的線程,為什么還能做到停頓時(shí)間短呢。因?yàn)?strong>初始標(biāo)記階段只是標(biāo)記GC Roots能直接關(guān)聯(lián)的對(duì)象,這個(gè)過程很快。而并發(fā)標(biāo)記時(shí)才進(jìn)行沿GC Roots遍歷所有對(duì)象,這個(gè)工作量說不小的,但這個(gè)過程并沒有停頓用戶線程,而是與其并發(fā)執(zhí)行,如果再過程出現(xiàn)對(duì)象引用關(guān)系改變,則使用增量更新的方法將其標(biāo)記。待重新標(biāo)記階段就是為了解決這個(gè)并發(fā)過程中因?yàn)楦淖兌粯?biāo)記的對(duì)象。這個(gè)階段是要暫停用戶線程的,但這部分的工作量也不大。最后全部標(biāo)記玩就進(jìn)入了并發(fā)清除的階段了。這部分也是與用戶線程并發(fā)進(jìn)行的。
從整體上看來耗時(shí)長的并發(fā)標(biāo)記和并發(fā)清除都沒有暫停用戶線程,所有可以說:從總體上來說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)執(zhí)行的。
缺點(diǎn):?
- CMS收集器對(duì)CPU資源很敏感。它雖然不會(huì)導(dǎo)致用戶線程停頓,但也會(huì)因?yàn)檎加靡徊糠志€程導(dǎo)致應(yīng)用程序變慢。它默認(rèn)啟動(dòng)的回收線程數(shù)是(核心線程數(shù)+3)/4,所以隨著核心線程數(shù)的降低,CMS收集器的弊端會(huì)越來越明顯。
- CMS是一款基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器,這意味著收集結(jié)束時(shí)會(huì)有大量空間碎片產(chǎn)生??臻g 碎片過多時(shí),將會(huì)給大對(duì)象分配帶來很大麻煩,往往會(huì)出現(xiàn)老年代還有很多剩余空間,但就是無法找 到足夠大的連續(xù)空間來分配當(dāng)前對(duì)象,所以會(huì)提前導(dǎo)致Full GC的到來。
- CMS無法處理浮動(dòng)垃圾(再清除階段用戶線程還在運(yùn)行,產(chǎn)生的垃圾)。必須等到下次GC時(shí)才能清理,而且不能等到老年代滿了后再清理,因?yàn)樵偾謇磉^程中用戶線程還在產(chǎn)生對(duì)象,所以要預(yù)留一定內(nèi)存,提前開啟垃圾清理。
7、G1收集器(Garbage First)
? ? ? ? G1是一種“停頓時(shí)間模型”的收集器,它能指定時(shí)間N,確保消耗再垃圾收集上時(shí)間大概率不超過N毫秒的目的。G1收集器一改之前的分區(qū)收集思想,開創(chuàng)了面對(duì)局部收集的設(shè)計(jì)思路。它將java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域Region。它可以面對(duì)堆內(nèi)存任何部分組成回收集進(jìn)行回收。這個(gè)模型回收哪塊的衡量標(biāo)準(zhǔn)是哪塊Region垃圾最多,再N毫秒內(nèi)回收收益最大。這就是G1收集器的Mixed GC模式。
? ? ? ? 再并發(fā)操作階段,CMS收集器采用增量更新算法實(shí)現(xiàn),而G1 收集器則是通過原始快照(SATB)算法來實(shí)現(xiàn)的。
收集過程:
- 初始標(biāo)記:僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,需要暫停用戶線程,但耗時(shí)很短。
- 并發(fā)標(biāo)記:從GC Root開始對(duì)堆中對(duì)象進(jìn)行可達(dá)性分析,遞歸掃描整個(gè)堆 里的對(duì)象圖,找出要回收的對(duì)象,這階段耗時(shí)較長,但可與用戶程序并發(fā)執(zhí)行。當(dāng)對(duì)象圖掃描完成以 后,還要重新處理SATB記錄下的在并發(fā)時(shí)有引用變動(dòng)的對(duì)象。 ·
- 最終標(biāo)記:對(duì)用戶線程做另一個(gè)短暫的暫停,用于處理并發(fā)階段結(jié)束后仍遺留 下來的最后那少量的SATB記錄。 ·
- 篩選回收:負(fù)責(zé)更新Region的統(tǒng)計(jì)數(shù)據(jù),對(duì)各個(gè)Region的回 收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的停頓時(shí)間來制定回收計(jì)劃,可以自由選擇任意多個(gè)Region 構(gòu)成回收集,然后把決定回收的那一部分Region的存活對(duì)象復(fù)制到空的Region中,再清理掉整個(gè)舊 Region的全部空間。這里的操作涉及存活對(duì)象的移動(dòng),是必須暫停用戶線程,由多條收集器線程并行 完成的。
????????毫無疑問,可以由用戶指定期望的停頓時(shí)間是G1收集器很強(qiáng)大的一個(gè)功能,設(shè)置不同的期望停頓 時(shí)間,可使得G1在不同應(yīng)用場(chǎng)景中取得關(guān)注吞吐量和關(guān)注延遲之間的最佳平衡。當(dāng)然這個(gè)值也得是一個(gè)可能的值,要是太低了,就會(huì)導(dǎo)致每次回收不了多少,回收次數(shù)增加。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-807541.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-807541.html
?
?
到了這里,關(guān)于JVM:垃圾收集器(7種)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!