前言:
串行回收,Serial回收器,單線程回收,全程stw;
缺點是隻有一個線程,執行垃圾回收時程式停止的時間比較長
并行回收,名稱以Parallel開頭的回收器,多線程回收,全程stw;
指多條垃圾收集線程并行工作,但此時使用者線程仍然處于等待狀态。
多個線程執行垃圾回收适合于吞吐量的系統,回收時系統會停止運作 高并發項目适合
并發回收,cms與G1,多線程分階段回收,隻有某階段會stw;
指使用者線程與垃圾收集線程同時執行(但不一定是并行的,可能會交替進行),使用者程式在繼續鏡像,而垃圾收集程式運作于另一個CPU上。
下面常用的四個收集器:
串行收集器是最古老,最穩定以及效率高的收集器,可能會産生較長的停頓,隻使用一個線程去回收。
新生代、老年代使用串行回收;新生代複制算法、老年代标記-壓縮;
垃圾收集的過程中會Stop The World(服務暫停)
一個單線程的收集器,在進行垃圾收集時候,必須暫停其他所有的工作線程直到它收集結束。
通過JVM參數-XX:+UseSerialGC可以使用串行垃圾回收器。
特點:CPU使用率最高,停頓時間即使用者等待時間比較長。
适用場景:小型應用
ParNew收集器其實就是Serial收集器的多線程版本。
新生代并行,老年代串行;新生代複制算法、老年代标記-壓縮
參數控制:-XX:+UseParNewGC ParNew收集器。-XX:ParallelGCThreads 限制線程數量。
新生代并行,老年代串行目的:回收頻率決定的。
Parallel Scavenge收集器類似ParNew收集器。
Parallel收集器更關注系統的吞吐量(并行的)。可以通過參數來打開自适應調節政策,虛拟機會根據目前系統的運作情況收集性能監控資訊,動态調整這些參數以提供最合适的停頓時間或最大的吞吐量
也可以通過參數控制GC的時間不大于多少毫秒或者比例;新生代複制算法、老年代标記-壓縮
通過JVM參數-XX:+UseParallelGC 打開并發标記掃描垃圾回收器。
采用多線程來通過掃描并壓縮堆 特點:停頓時間短,回收效率高,對吞吐量要求高。 适用場景:大型應用,科學計算,大規模資料采集等。
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)
通過JVM參數 -XX:+UseConcMarkSweepGC設定
優點:
缺點:
1.對CPU資源非常敏感
2.CMS收集器無法處理浮動垃圾,即清除時使用者程序同時産生的垃圾,隻能等到下次GC時回收,并發階段會降低吞吐量
3.因為是使用“标記-清除”算法,是以會産生大量碎片
特點:響應時間優先,減少垃圾收集停頓時間,适用于對響應時間要求高的系統
适應場景:大型伺服器等。
在G1中,堆被劃分成 許多個連續的區域(region)。采用G1算法進行回收,吸收了CMS收集器特點。
特點:支援很大的堆,高吞吐量
支援多CPU和垃圾回收線程
在主線程暫停的情況下,使用并行收集
在主線程運作的情況下,使用并發收集
實時目标:可配置在N毫秒内最多隻占用M毫秒的時間進行垃圾回收
通過JVM參數 -XX:+UseG1GC 使用G1垃圾回收器
注意: 并發是指一個處理器同時處理多個任務。 并行是指多個處理器或者是多核的處理器同時處理多個不同的任務。 并發是邏輯上的同時發生(simultaneous),而并行是實體上的同時發生。 來個比喻:并發是一個人同時吃三個饅頭,而并行是三個人同時吃三個饅頭。