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