天天看點

[jvm]GC收集器總概

Serial垃圾收集器

Serial 收集器使用單線程清理堆的内容。使用 Serial 收集器,無論是進行 Minor GC 還是 Full GC,清理堆空間時,所有的應用線程都會被暫停。進行 Full GC 時,它還會對老年代 空間的對象進行壓縮整理。

Throughput垃圾收集器

Throughput 收集器使用多線程回收新生代空間,Minor GC 的速度比使用 Serial 收集器快 得多。由于 Throughput 收集器使用多線程,Throughput 收集器也常常 被稱為 Parallel 收集器。Throughput 收集器在 Minor GC 和 Full GC 時會暫停所有的應 用線程,同時在 Full GC 過程中會對老年代空間進行壓縮整理。

CMS收集器

CMS 收集器設計的初衷是為了消除 Throughput 收集器和 Serial 收集器 Full GC 周期中 的長時間停頓。CMS 收集器在 Minor GC 時會暫停所有的應用線程,并以多線程的方式 進行垃圾回收。

CMS 收集器在 Full GC 時不再暫停應用線程,而是使用若幹個背景線程定期地對老年代空 間進行掃描,及時回收其中不再使用的對象。這種算法幫助 CMS 成為一個低延遲的收集 器:應用線程隻在 Minor GC 以及背景線程掃描老年代時發生極其短暫的停頓。應用程式 線程停頓的總時長與使用 Throughput 收集器比起來短得多。

G1垃圾收集器

G1 垃圾收集器(或者垃圾優先收集器)的設計初衷是為了盡量縮短處理超大堆(大于 4 GB)時産生的停頓。G1 收集算法将堆劃分為若幹個區域(Region),不過它依舊屬于分代 收集器。這些區域中的一部分包含新生代,新生代的垃圾收集仍然采用暫停所有應用線程 的方式,将存活對象移動到老年代或者 Survivor 空間。同其他的收集算法一樣,這些操作 也利用多線程的方式完成。

G1 收集器屬于 Concurrent 收集器:老年代的垃圾收集工作由背景線程完成,大多數的工 作不需要暫停應用線程。由于老年代被劃分到不同的區域,G1 收集器通過将對象從一個 區域複制到另一個區域,完成對象的清理工作,這也意味着在正常的處理過程中,G1 收 集器實作了堆的壓縮整理(至少是部分的整理)。是以,使用 G1 收集器的堆不大容易發生 碎片化——雖然這種問題無法避免。

摘抄至------《Java性能權威指南》5.1.2