jvm中的垃圾收集器
1、Serial收集器
Seral收集器是最基本、歷史最悠久的收集器,曾經(在JDK1.3.1之前)是虛擬機器新生代收集的唯一選擇。它是單執行緒收集器,它在進行垃圾收集時,必須停止所有的工作執行緒,直到它收集結束。“Stop The World”把使用者正常工作的執行緒全部停掉,多少會令使用者無法接受。Serial收集器依然是虛擬機器執行在Client模式下的預設新生代收集器,簡單而高效(與其他收集器的單執行緒比),對於執行在Client模式下的虛擬機器來說是一個很好的選擇。
2、ParNew收集器
ParNew收集器是Serial收集器的多執行緒版本,它是許多執行在Server模式下的虛擬機器中首選的新生代收集器,有一個很重要的原因是除了Serial收集器外,目前只有它能與CMS收集器配合工作。
3、Parallel Scavenge收集器
Parallel Scavenge收集器看起來和ParNew都一樣,其更著重關注於達到一個可控制的吞吐量(吞吐量=執行使用者程式碼時間/(執行使用者程式碼時間+垃圾收集時間))。它被稱為“吞吐量優先”的收集器。自適應調節策略也是Parallel Scavenge收集器與ParNew收集器的一個重要區別。
4、Serial Old收集器
Serial Old是Serial收集器的老年代版本,它同樣是一個單執行緒收集器,使用“標記-整理”演算法。這個收集器的主要意義也是在於給Client模式下的虛擬機器使用。如果在Server模式下,那麼它主要還有兩大用途:一種用途是在JDK1.5以及之前的版本中與Parallel Scavenge收集器搭配使用,另一種用途就是作為CMS收集器的後備預案,在病發收集發生Concurrent Mode Failure時使用。
5、Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年版本,使用多執行緒和“標記-整理”演算法。
6、CMS收集器
CMS收集器是一種以獲取最短回收停頓時間為目標的收集器。它是基於“標記-清楚”演算法實現的,它的運作過程相對於前面幾種收集器來說更復雜一些,整個過程分為四個步驟,包括:初始標記、併發標記、重新標記、併發清除。其中,初識標記、重新標記這兩個步驟仍然需要“Stop The World”。CMS是一款優秀的收集器,稱其為併發低停頓收集器。
7、G1收集器
G1收集器與其他收集器相比,G1具備如下特點:並行與併發、分代收集、空間整合、可預測的停頓。在G1之前的其他收集器進行收集的範圍都是整個新生代或者老年代,而G1不再是這樣。使用G1收集器時,java堆記憶體佈局就與其他收集器有很大差別,它將整個java堆劃分為多個大小相等的獨立區域(Region),雖然還保留新生代和老年代的概念,但新生代和老年代不再是物理隔離的了,它們是一部分Region(不需要連續)的集合。如果不計算維護Remembered Set的操作,G1收集器的運作大致可分為以下幾個步驟:初始標記,併發標記,最終標記,篩選回收。
摘自:《深入理解java虛擬機器》