1. 程式人生 > >一步一步學JVM-垃圾回收器

一步一步學JVM-垃圾回收器

trac 部分 current 可控 吞吐量 收集器 控制 需要 但是

Serial收集器

Serial收集器是最基本、歷史最悠久的收集器。這個收集器是一個單線程的收集器。它在進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。Serial收集器是新生代的收集器。采用的復制算法。

ParNew收集器

ParNew收集器其實就是Serial收集器的多線程版本,除了使用多線程進行垃圾收集之外,其余的和Serial收集器都是一樣的。它是運行在Server模式下的虛擬機中首選的新生代收集器。其中有一個很重要的原因是除了Serial收集器外,目前只有它能與CMS收集器配合工作。

Parallel Scavenge收集器

Parallel Scavenge收集器是一個新生代收集器,它也是采用復制算法的收集器,又是並行的多線程收集器。

Parallel Scavenge收集器的特點是它的關註點與其他收集器不同,CMS等收集器的關註點是盡可能地縮短垃圾收集時用戶線程的停頓時間,而Paralel Scavenge收集器的目標則是達到一個可控制的吞吐量。

由於與吞吐量關系密切,Parallel Scavenge收集器也經常稱為“吞吐量優先”收集器。

Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用“標記-整理”算法。Serial和Serial Old收集器的主要意義都是在於給Client模式下虛擬機使用。還有另外兩個用途,一種用途是在JDK1.5以及之前的版本中與Parallel Scavenge收集器搭配使用,另一種用途就是作為CMS收集器的後備元,在並發收集發生Concurrent Mode Failure時使用。

Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。

CMS收集器

CMS收集器是一種以獲取最短回收停頓時間為目標的收集器。CMS收集器是基於“標記-清除”算法實現的。它的運行過程分為4個步驟。

1、 初始標記

2、 並發標記

3、 重新標記

4、 並發清除

  其中,初始標記、重新標記這兩個步驟仍然需要“Stop The World”。初始標記僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快,並發標記階段就是進行GC Roots Tracing的過程,而重新標記則是為了修正並發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比並發標記的時間短。

  由於整個過程中耗時最長的並發標記和並發清除過程收集器線程都可以與用戶線程一起工作。所以,從總體上來說,CMS收集器的內存回收過程是與用戶線程一起並發執行的。

CMS收集器的缺點:

  CMS收集器對CPU資源非常敏感。在並發階段,它雖然不會導致用戶線程停頓,但是會因為占用了一部分線程而導致應用程序變慢,總吞吐量降低。CMS默認啟動的回收線程數是(CPU數量+3)/4,如果服務器的CPU數量很多,就會造成用戶程序的執行速度變慢。

  CMS收集器無法處理浮動垃圾。可能出現“Concurrent Mode Failure”失敗而導致另一次Full GC的產生。

  CMS收集器是一款基於“標記-清除”算法實現的收集器,這意味著收集結束時會有大量內存碎片產生。為了解決這個問題,CMS收集器提供了一個參數,用於在CMS收集器頂不住要進行Full GC時開啟內存碎片合並整理過程,內存整理過程是無法並發的,內存碎片沒有了,但停頓時間不得不變長。

一步一步學JVM-垃圾回收器