四种常用垃圾收集器
有沒有人知道并行回收和串行回收的區(qū)別:1. 一個是串行單線程,并行是多線程的回收,串行是單線程,一般來說很少用串行,服務(wù)器一般都是多核的,一般都是并行回收的,并行收集器和串行收集器的區(qū)別是什么呢,在JDK1.5之前,默認(rèn)算法就是串行回收,垃圾收集器如果在回收的時候,他就會停止其他的線程,而且會影響到其他的線程,這也是他的缺點,串行收集一般用于傳統(tǒng)的項目,有些傳統(tǒng)的項目是不會做JVM調(diào)優(yōu)的2. 并行回收,多線程去回收的,多個線程去回收一個垃圾,這一般適合于吞吐量的系統(tǒng),吞吐量你們知道是什么意思嗎,一般你們做高并發(fā)的時候你們會知道,像別人做測試的時候,測試你的網(wǎng)站到底好不好,就是他的吞吐量有多少,并行回收相當(dāng)于多線程回收,一般用在高并發(fā)的項目,一般高并發(fā)的項目都是并行回收的,很少有串行回收的,串行回收性能不好,但是也會停止運行一段時間的,但是時間不是很長,但是我們的肉眼是看不出來,通過拿到其他線程,讓其線程等待一下,讓我的線程進(jìn)行執(zhí)行,這是JVM底層做的,不是通過notify和wait在這里給大家說一下比較常用的收集器,都是圍繞串行和并行回收的,1. Serial收集器Serial收集器一般是比較古老,一般是使用在串行里面的,但是效率會比較高啊,至少是在1.5之前,他可能會產(chǎn)生比較大的停頓,因為它只有一個線程去回收,我之前講過一些垃圾回收算法,第一種叫做標(biāo)記清除算法,還有復(fù)制算法,還有標(biāo)記壓縮算法,還有分代算法,這些算法分別用在什么場景,標(biāo)記清除用在什么場景,新生代還是老年代,一般用到老年代,標(biāo)記清除用在老年代,復(fù)制算法采用在新生代里面,標(biāo)記壓縮是用在老年代還是新生代呢,他一般也是用在老年代里面的,分代算法是把這些算法做一個整合,新生代和老年代做不同的收集,Minor GC和Full GC,這兩個GC分代進(jìn)行回收的,垃圾收集器會使用我們這些算法,全部都會用到的,這個時候可以看到一個效果Serial是用在串行的,像新生代的復(fù)制算法,老年代使用壓縮算法,反正串行回收一般用于小型項目,像我在一開始做JVM調(diào)優(yōu)的時候,用的是串行呢還是并行呢,串行啊,你們看看效果,-XX:+UseSerialGC,串行回收,你們配置怎么配呢,就是這么配的,相當(dāng)于你在用串行收集器,這里還有一個Paralle收集器2. ParNew 收集器默認(rèn)肯定也是穿行的,而且你默認(rèn)并行肯定不好啊,萬一我在單核服務(wù)器里面,那我怎么去進(jìn)行回收呢,肯定默認(rèn)是串行的,只有在JDK1.5的時候采用并行回收,ParNew收集器其實也是Serial里的,只不過是多線程版本,新生代是并行,老年代是用串行,你們知道為什么要新生代使用并行,老年代使用串行,這么設(shè)計的目的是什么,回收率高的就使用并行,回收率不高就使用串行,新生代復(fù)制算法,老年代標(biāo)記壓縮算法,配置-XX:+UseParNewGC ParNew這個參數(shù)就可以新生代使用并行,老年代使用串行,配置+XX:ParalleGCThreads限制線程數(shù)量3. parallel這個其實和ParNew非常的相似,區(qū)別不大,但是講一下,Parallel Scanvenge其實類似于ParNew收集器,這個更加關(guān)注于吞吐量,既然他更加關(guān)注于吞吐量,這個是串行還是并行,采用多線程來掃描并壓縮堆,肯定是并行,特點是停頓時間短,回收率高,對吞吐量要求高,一般應(yīng)用于大型系統(tǒng)4. CMS收集器CMS是在JDK1.7的時候出來的,目前來說還是用的比較流行的,也是以最短的時間回收的收集器,他的核心是怎么去實現(xiàn)的,其中會做初始標(biāo)記和重新標(biāo)記,采用標(biāo)記清除算法,采用多線程掃描堆,對發(fā)現(xiàn)的未使用對象進(jìn)行回收,初始標(biāo)記,并發(fā)標(biāo)記,并發(fā)預(yù)處理,重新標(biāo)記,并發(fā)清除,并發(fā)重置,反正最后一句話,CMS響應(yīng)時間優(yōu)先,減少垃圾收集器的停頓時間,一般使用在服務(wù)器里面,一般大型的服務(wù)器里面,大型的服務(wù)器里面,一般都是用CMS的,CMS收集器Concurrent Mark Sweep,5. G1收集器G1是在CMS上做改進(jìn)的,目前用的最多的是G1收集器,G1收集器最大的特點是什么呢,它吸收了CMS的一些特點,他最大的優(yōu)點是什么呢,他能支持很大的堆,高吞吐量,支持多CPU核垃圾收集線程,而且在主線程暫停的情況下,使用并行收集器,在主線程運行的情況下,使用并發(fā)收集,這個時候就有疑問了,并發(fā)和并行的區(qū)別,并行是同時進(jìn)行,并發(fā)是在同一個處理器上同時處理多個任務(wù),這叫并發(fā),并行是多個處理器或者多核同時處理多個不同的任務(wù),這是他們本質(zhì)上最大的區(qū)別,但是我舉個最明顯的例子,并發(fā)你可以怎么理解呢,并發(fā)是同時一個人吃三個饅頭,而并行是三個人同時在吃三個饅頭,為什么叫并發(fā)編程,而不叫并行編程,你們知道為什么沒有,這個比喻非常通俗易懂,并發(fā)你們這樣理解,一個人同時吃一個饅頭,并行是三個人吃三個饅頭,為什么叫并發(fā)編程,不交并行編程,多線程為什么叫并行執(zhí)行,因為CPU不停的在切換不同的線程執(zhí)行,并發(fā)是一個人同時處理不同的業(yè)務(wù),并行是三個人同時在吃三個饅頭
垃圾收集器
串行與并行收集器
串行回收: JDK1.5前的默認(rèn)算法 缺點是只有一個線程,執(zhí)行垃圾回收時程序停止的時間比較長
并行回收: 多個線程執(zhí)行垃圾回收適合于吞吐量的系統(tǒng),回收時系統(tǒng)會停止運行serial收集器
串行收集器是最古老,最穩(wěn)定以及效率高的收集器,可能會產(chǎn)生較長的停頓,只使用一個線程去回收。新生代、老年代使用串行回收;新生代復(fù)制算法、老年代標(biāo)記-壓縮;垃圾收集的過程中會Stop The World(服務(wù)暫停)一個單線程的收集器,在進(jìn)行垃圾收集時候,必須暫停其他所有的工作線程直到它收集結(jié)束。
特點:CPU利用率最高,停頓時間即用戶等待時間比較長。
適用場景:小型應(yīng)用
通過JVM參數(shù)-XX:+UseSerialGC可以使用串行垃圾回收器。ParNew收集器ParNew收集器其實就是Serial收集器的多線程版本。新生代并行,老年代串行;新生代復(fù)制算法、
老年代標(biāo)記-壓縮
參數(shù)控制:-XX:+UseParNewGC ParNew收集器
-XX:ParallelGCThreads 限制線程數(shù)量
parallel 收集器
Parallel Scavenge收集器類似ParNew收集器,Parallel收集器更關(guān)注系統(tǒng)的吞吐量。
可以通過參數(shù)來打開自適應(yīng)調(diào)節(jié)策略,虛擬機(jī)會根據(jù)當(dāng)前系統(tǒng)的運行情況收集性能監(jiān)控信息,
動態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時間或最大的吞吐量;
也可以通過參數(shù)控制GC的時間不大于多少毫秒或者比例;新生代復(fù)制算法、老年代標(biāo)記-壓縮采用多線程來通過掃描并壓縮堆
特點:停頓時間短,回收效率高,對吞吐量要求高。
適用場景:大型應(yīng)用,科學(xué)計算,大規(guī)模數(shù)據(jù)采集等。
通過JVM參數(shù) XX:+USeParNewGC 打開并發(fā)標(biāo)記掃描垃圾回收器。cms收集器
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標(biāo)的收集器。
目前很大一部分的Java應(yīng)用都集中在互聯(lián)網(wǎng)站或B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度,
希望系統(tǒng)停頓時間最短,以給用戶帶來較好的體驗。
從名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于“標(biāo)記-清除”算法實現(xiàn)的,
它的運作過程相對于前面幾種收集器來說要更復(fù)雜一些,整個過程分為4個步驟,包括:
初始標(biāo)記(CMS initial mark)
并發(fā)標(biāo)記(CMS concurrent mark)
重新標(biāo)記(CMS remark)
并發(fā)清除(CMS concurrent sweep)
其中初始標(biāo)記、重新標(biāo)記這兩個步驟仍然需要“Stop The World”。初始標(biāo)記僅僅只是標(biāo)記一下GC
Roots能直接關(guān)聯(lián)到的對象,速度很快,并發(fā)標(biāo)記階段就是進(jìn)行GC Roots Tracing的過程,
而重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間,因用戶程序繼續(xù)運作而導(dǎo)致標(biāo)記產(chǎn)生變動的
那一部分對象的標(biāo)記記錄,這個階段的停頓時間一般會比初始標(biāo)記階段稍長一些,但遠(yuǎn)比并發(fā)標(biāo)記的時間短。 由于整個過程中耗時最長的并發(fā)標(biāo)記和并發(fā)清除過程中,收集器線程都可以與用戶線程一起工作,
所以總體上來說,CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)地執(zhí)行。老年代收集器(新生代使用ParNew)優(yōu)點:并發(fā)收集、低停頓
缺點:產(chǎn)生大量空間碎片、并發(fā)階段會降低吞吐量采用“標(biāo)記-清除”算法實現(xiàn),使用多線程的算法去掃描堆,對發(fā)現(xiàn)未使用的對象進(jìn)行回收。
(1)初始標(biāo)記
(2)并發(fā)標(biāo)記
(3)并發(fā)預(yù)處理
(4)重新標(biāo)記
(5)并發(fā)清除
(6)并發(fā)重置
特點:響應(yīng)時間優(yōu)先,減少垃圾收集停頓時間
適應(yīng)場景:大型服務(wù)器等。
通過JVM參數(shù) -XX:+UseConcMarkSweepGC設(shè)置
g1收集器
在G1中,堆被劃分成 許多個連續(xù)的區(qū)域(region)。采用G1算法進(jìn)行回收,吸收了CMS收集器特點。
特點:支持很大的堆,高吞吐量--支持多CPU和垃圾回收線程--在主線程暫停的情況下,使用并行收集--在主線程運行的情況下,使用并發(fā)收集
實時目標(biāo):可配置在N毫秒內(nèi)最多只占用M毫秒的時間進(jìn)行垃圾回收
通過JVM參數(shù) -XX:+UseG1GC 使用G1垃圾回收器
注意: 并發(fā)是指一個處理器同時處理多個任務(wù)。
并行是指多個處理器或者是多核的處理器同時處理多個不同的任務(wù)。
并發(fā)是邏輯上的同時發(fā)生(simultaneous),而并行是物理上的同時發(fā)生。
來個比喻:并發(fā)是一個人同時吃三個饅頭,而并行是三個人同時吃三個饅頭。
?
總結(jié)
- 上一篇: 内存溢出与内存泄漏区别
- 下一篇: jmetery压力测试工具