教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

jvm垃圾收集器有哪些?深度講解

更新時(shí)間:2021年10月22日11時(shí)52分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

Serial收集器

Serial收集器是最基本,發(fā)展最悠久的收集器,在JDK1.3.1之前是虛擬機(jī)新生代垃圾回收的唯一選擇。這個(gè)收集器是一個(gè)單線程的。它的單線程的意義并不僅僅說(shuō)明它只會(huì)使用一個(gè)CPU或者一條收集線程去完成收集工作,最重要的是,它進(jìn)行垃圾收集時(shí),其他工作線程會(huì)暫停,直到收集結(jié)束。這項(xiàng)工作由虛擬機(jī)在后臺(tái)自動(dòng)發(fā)起和執(zhí)行的,在用戶不可見(jiàn)的情況下將所有工作線程全部停掉,這對(duì)于很多應(yīng)用程序來(lái)說(shuō)是不可容忍的。我們可以設(shè)想一下,我們的計(jì)算機(jī)在運(yùn)行1個(gè)小時(shí)就要停止5分鐘的時(shí)候,這是什么情況?對(duì)于這種設(shè)計(jì),虛擬機(jī)設(shè)計(jì)人員表示的也是非常委屈,因?yàn)椴豢赡苓吺占?,這邊還要不斷的產(chǎn)生垃圾對(duì)象,這樣是清理不完的。所以從1.3一直到現(xiàn)在,虛擬機(jī)的開(kāi)發(fā)團(tuán)隊(duì)一直為減少因垃圾回收而產(chǎn)生的線程停頓所努力著,所出現(xiàn)的虛擬機(jī)越來(lái)越優(yōu)秀,但直到現(xiàn)在,依然沒(méi)有完全消除。

講到這里,貌似Serial收集器已經(jīng)是"食之無(wú)味棄之可惜"了,但實(shí)際上,它依然是虛擬機(jī)在Client模式下,新生代默認(rèn)的垃圾收集器。它有相對(duì)于其他垃圾收集器的優(yōu)勢(shì),比如由于沒(méi)有線程之間切換的開(kāi)銷,專心做垃圾收集自然能夠收獲最高的線程利用效率。在用戶桌面應(yīng)用背景下,一般分配給虛擬機(jī)的內(nèi)存不會(huì)太大,收集幾十兆或者一兩百兆的新生代對(duì)象,停頓時(shí)間完全可以控制在幾十毫秒到一百毫秒之間,這個(gè)是可以接受的,只要不是頻繁發(fā)生。因此,Serial收集器在Client模式下,對(duì)于新生代來(lái)說(shuō)依然是一個(gè)很好的選擇。

Serial收集器

ParNew收集器

ParNew收集器其實(shí)就是Serial收集器的多線程版本,除了使用多線程進(jìn)行垃圾回收之外,其余可控參數(shù),收集算法,停止工作線程,對(duì)象分配原則,回收策略等與Serial收集器完全一致。

除了多線程實(shí)現(xiàn)垃圾收集之外,其他沒(méi)有什么太多創(chuàng)新之處,但是它確實(shí)Server模式下的新生代的首選的虛擬機(jī)收集器。其中一個(gè)重要的原因就是除了Serial收集器外,只有它能與CMS配合使用。在JDK1.5時(shí)期,HotSpot推出了一款在強(qiáng)交互應(yīng)用劃時(shí)代的收集器CMS,這款收集器是HotSpot第一款真正意義上的并發(fā)收集器,第一次實(shí)現(xiàn)了垃圾回收與工作線程同時(shí)工作的可能性,換而言之,你可以邊污染,邊收集。

不過(guò)CMS作為老年代的收集器,卻無(wú)法與1.4中發(fā)布的最新的新生代垃圾收集器配合使用,反之只能使用Serial或者Parnew中的一個(gè)。ParNew收集器可以使用-XX:+UseParNewGC強(qiáng)行指定它,或者使用-XX:+UseConcMarkSweepGC選項(xiàng)后的默認(rèn)新生代收集器。

ParNew收集器在單CPU環(huán)境下絕對(duì)不會(huì)有比Serial收集器更好的效果,甚至優(yōu)于存在線程交互開(kāi)銷,該收集器在通過(guò)超線程技術(shù)實(shí)現(xiàn)的兩個(gè)CPU的環(huán)境下都不能保證百分之百超越Serial收集器。當(dāng)然,隨著CPU數(shù)量的增加,對(duì)于GC時(shí)系統(tǒng)的有效資源利用還是很有好處的。在CPU非常多的情況下,可以使用-XX:ParallelGCThreads來(lái)限制垃圾回收線程的數(shù)量。

ParNew收集器

Parallel Scavenge收集器

Parallel Scavenge收集器是一個(gè)新生代收集器,采用復(fù)制算法,又是并行的多線程垃圾收集器。它的關(guān)注點(diǎn)與其它收集器的關(guān)注點(diǎn)不一樣,CMS等收集器的關(guān)注點(diǎn)在于縮短垃圾回收時(shí)用戶線程停止的時(shí)間,而Parallel Scavenge收集器則是達(dá)到一個(gè)可控制的吞吐量,所謂吞吐量就是CPU運(yùn)行用戶線程的時(shí)間與CPU運(yùn)行總時(shí)間的比值,即 吞吐量 = (用戶線程工作時(shí)間)/(用戶線程工作時(shí)間 + 垃圾回收時(shí)間),比如虛擬機(jī)總共運(yùn)行100分鐘,垃圾收集消耗1分鐘,則吞吐量為99%。停頓時(shí)間越短越適合與用戶交互的程序,良好的響應(yīng)速度能提高用戶體驗(yàn),但是高吞吐量則可以高效率的利用CPU的時(shí)間,盡快完成程序的運(yùn)算任務(wù),主要適合在后臺(tái)運(yùn)算而不需要太多交互的程序。

有兩個(gè)參數(shù)控制吞吐量,分別為最大垃圾收集時(shí)間: -XX:MaxGCPauseMills, 直接設(shè)置吞吐量的大小: -XX:GCTimeRatio

-XX:+UseAdaptiveSizePolicy

自適應(yīng)策略也是Parallel Scavenge收集器區(qū)別去Parnew收集器的重要一點(diǎn)


Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,它同樣是一個(gè)單線程收集器,使用標(biāo)記-整理算法,這個(gè)收集器的主要目的也是在與給Client模式下使用。如果在Server模式下,還有兩種用途,一種是在jdk5以前的版本中配合Parallel Scavenge收集器使用,另一種用途作為CMS的備用方案,在并發(fā)收集發(fā)生Concurrent Mode Failure時(shí)使用。


Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多線程和標(biāo)記-整理算法,這個(gè)收集器在jdk6中才開(kāi)始使用的,在此之前Parallel Scavenge收集器一直處于比較尷尬的階段,原因是,如果新生代采用了Parallel Scavenge收集器,那么老年代除了Serial Old之外,別無(wú)選擇,由于老年代Serial在服務(wù)端的拖累,使得使用了Parallel Scavenge收集器也未必能達(dá)到吞吐量最大化的效果,由于單線程的老年代無(wú)法充分利用服務(wù)器多CPU的處理能力,在老年代很大而且硬件比較高級(jí)的環(huán)境中,這種組合的吞吐量甚至不如Parallel Scavenge收集器 + CMS。

直到Parallel Old收集器出現(xiàn)后,"吞吐量?jī)?yōu)先收集器"終于有了名副其實(shí)的組合,在注重吞吐量?jī)?yōu)先和CPU資源敏感的場(chǎng)合,可以采用Parallel Scavenge收集器 + Parallel Old收集器。

Parallel Old收集器

CMS收集器

CMS收集器是一種以獲取最短停頓時(shí)間為目標(biāo)的收集器。從名字(Concurrent Mark Sweep)上就可以看出,采用的標(biāo)記-清除算法,它的過(guò)程分為4個(gè)步驟:

只有初始標(biāo)記和重新標(biāo)記需要暫停用戶線程。

(1)初始標(biāo)記 --- 僅僅關(guān)聯(lián)GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快;

(2)并發(fā)標(biāo)記 --- 進(jìn)行GC Roots Tracing的過(guò)程;

(3)重新標(biāo)記 --- 為了修正并發(fā)標(biāo)記期間,因用戶程序運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄;

(4)并發(fā)清除

CMS收集器

由于整個(gè)過(guò)程中耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除過(guò)程收集器都能與用戶線程一起工作,所以總的來(lái)說(shuō),CMS的內(nèi)存回收過(guò)程與用戶線程一起并發(fā)執(zhí)行的

CMS收集器的三大缺點(diǎn):

(1)CMS收集器對(duì)CPU資源非常敏感

(2)無(wú)法處理浮動(dòng)垃圾

(3)因?yàn)榛跇?biāo)記清除算法,所以會(huì)有大量的垃圾碎片產(chǎn)生 -XX:+UseCMSCompactAtFullCollection


G1收集器

首先,G1的設(shè)計(jì)原則就是簡(jiǎn)單可行的性能調(diào)優(yōu)

-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=200

其中-XX:+UseG1GC為開(kāi)啟G1垃圾收集器,-Xmx32g 設(shè)計(jì)堆內(nèi)存的最大內(nèi)存為32G,-XX:MaxGCPauseMillis=200設(shè)置GC的最大暫停時(shí)間為200ms。如果我們需要調(diào)優(yōu),在內(nèi)存大小一定的情況下,我們只需要修改最大暫停時(shí)間即可。

(1)內(nèi)存分配

(2)Young垃圾回收

(3)Mix垃圾回收

G1收集器

常見(jiàn)設(shè)置參數(shù):

G1收集器


添加QQ(注意~~添加好友界面,選擇找人):435946716,【免費(fèi)】獲取《JVM核心教程:JVM從門(mén)到精通_JVM虛擬機(jī)底層原理深入教程》全套視頻教程+配套資料



猜你喜歡

Java中的垃圾回收機(jī)制是什么?哪些對(duì)象會(huì)被回收?

垃圾收集算法有哪些?圖文詳細(xì)介紹

JVM組成部分和作用詳細(xì)介紹

傳智教育JavaEE高手班課程

0 分享到:
和我們?cè)诰€交談!