java虛擬機垃圾收集器
- 作者:新網
- 來源:新網
- 瀏覽:100
- 2018-04-26 15:53:54
對象的存活時間有長有短,所以對于存活時間長的對象,可以避免不必要的開銷。這樣我們就把內存分成新生代和老年代,下面和小編一起來了解一下吧。

<
div> 對象的存活時間有長有短,所以對于存活時間長的對象,可以避免不必要的開銷。這樣我們就把內存分成新生代和老年代,下面和小編一起來了解一下吧。
第一階段,串行收集器
Serial收集器
Serial收集器是一個單線程收集器,并且在JVM收集的過程中,必須暫停其它正在工作的線程,直到它收集結束。歷史悠久,在JDK 1.3.1之前是新生代收集的唯一選擇。目前僅是JVM運行在client模式下的默認新生代收集器。(因為client端資源有限,而它在處理時停頓時間可以控制在幾十毫秒以內)
Serial Old收集器
Serial Old收集器是Serial收集器的老年代版本,也是一個單線程收集器,使用標記整理算法實現。目前僅是JVM運行在client模式下收集老年代使用。
第二階段,并行收集器
ParNew收集器
ParNew收集器是Serial收集器的多線程版本。
Parallel Scavenge收集器
Parallel Scavenge收集器和ParNew收集器類似,也是新生代收集器,使用復制算法實現。
Parallel Old收集器
Parallel Old收集器也是老年代收集器,使用標記整理算法實現。
第三階段,CMS收集器(Concurrent Mark Sweep)
CMS收集器是一種以獲取最短回收停頓時間為目的的收集器,使用標記清理算法實現,是一個針對老年代進行回收的GC。
CMS處理4個階段:
初始標記:這個階段需要暫停所有正在執行的線程,官方叫法是STW(Stop The World)。標記和GC Roots直接關聯的對象,執行很快。
并發標記:這個階段進行GC Root Tracing,多線程執行,繼續標記可達到的對象。
并發預處理:這個階段標記從新生代晉升的對象,新分配到老年代的對象以及并發階段被修改的對象。
重新標記:暫停所有用戶線程,重新掃描堆中的對象,進行可達性分析,標記活著的對象。
并發清除:用戶線程被重新激活,同時清理那些無效的對象。
重置:CMS清除內部狀態,為下次回收做準備。
第四階段,G1收集器(Garbage-First)
G1收集器(或者垃圾優先收集器)的設計初衷是為了盡量縮短處理超大堆(大于4GB)時產生的停頓。相對于CMS的優勢而言是內存碎片的產生率大大降低。在G1中,堆被劃分成許多個連續的區域(region)。每個區域大小為2的倍數,大小相等,在1M~32M之間。當一個對象
空間大于一個區域的50%
G1處理4個階段:
初始標記:這個階段是SWT的,并且會觸發一次普通的Mintor GC。
并發標記:這個階段在整個堆中進行并發標記,若發現區域對象中的所有對象都可被回收,那這個區域會立即被回收。如果有不可被回收的對象,會計算該對象所在區域的對象活性(對象存活比率)。
重新標記:這個階段是SWT的,標記上一階段產生的垃圾。
并發清理:用戶線程被重新激活,同時清理那些無效的對象。
G1優點:
并發:G1能充分利用CPU、多核環境下的硬件優勢,使用多個CPU(CPU或者CPU核心)來縮短stop-The-World停頓時間。部分其他收集器原本需要停頓線程執行的GC動作,G1收集器仍然可以通過并發的方式讓程序繼續執行。
分代收集:雖然G1可以不需要其他收集器配合就能獨立管理整個GC堆,但是還是保留了分代的概念。它能夠采用不同的方式去處理新創建的對象和已經存活了一段時間,熬過多次GC的舊對象以獲取更好的收集效果。
空間整合:與CMS的“標記清理”算法不同,G1從整體來看是基于“標記整理”算法實現的收集器;從局部上來看是基于“復制”算法實現的。
可預測的停頓:這是G1相對于CMS的另一個大優勢,降低停頓時間是G1和CMS共同的關注點,但G1除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明確指定在一個長度為M毫秒的時間片段內。