常用的垃圾回收器

常用的垃圾回收器

大部分資料參考:http://www.noobyard.com/article/p-kwozwxkl-hq.html

1當前常用的垃圾回收器

 

STW:Java中Stop-The-World機制簡稱STW,是在執行垃圾收集算法時,Java應用程序的其他所有線程都被掛起(除了垃圾收集幫助器之外)。Java中一種全局暫停現象,全局停頓,所有Java代碼停止,native代碼可以執行,但不能與JVM交互;這些現象多半是由於gc引起。

  1. Serial

Serial收集器是最基本的、發展歷史最悠久的收集器。

特點:單線程、簡單高效(與其他收集器的單線程相比),對於限定單個CPU的環境來說,Serial收集器由於沒有線程交互的開銷,專心做垃圾收集自然可以獲得最高的單線程手機效率。收集器進行垃圾回收時,必須暫停其他所有的工作線程,直到它結束(Stop The World)。

應用場景:適用於Client模式下的虛擬機。

 

  1. Parallel Scavenge

與吞吐量關係密切,故也稱爲吞吐量優先收集器。

特點:屬於新生代收集器也是採用複製算法的收集器,又是並行的多線程收集器(與ParNew收集器類似)。

該收集器的目標是達到一個可控制的吞吐量。還有一個值得關注的點是:GC自適應調節策略(與ParNew收集器最重要的一個區別)

GC自適應調節策略:Parallel Scavenge收集器可設置-XX:+UseAdptiveSizePolicy參數。當開關打開時不需要手動指定新生代的大小(-Xmn)、Eden與Survivor區的比例(-XX:SurvivorRation)、晉升老年代的對象年齡(-XX:PretenureSizeThreshold)等,虛擬機會根據系統的運行狀況收集性能監控信息,動態設置這些參數以提供最優的停頓時間和最高的吞吐量,這種調節方式稱爲GC的自適應調節策略。

Parallel Scavenge收集器使用兩個參數控制吞吐量

XX:MaxGCPauseMillis 控制最大的垃圾收集停頓時間

XX:GCRatio 直接設置吞吐量的大小。

 

  1. parallel old

是Parallel Scavenge收集器的老年代版本。

特點:多線程,採用標記-整理算法。

應用場景:注重高吞吐量以及CPU資源敏感的場合,都可以優先考慮Parallel Scavenge+Parallel Old 收集器。

 

  1. Serial Old

Serial Old是Serial收集器的老年代版本。

特點:同樣是單線程收集器,採用標記-整理算法。

應用場景:主要也是使用在Client模式下的虛擬機中。也可在Server模式下使用。

Server模式下主要的兩大用途(在後續中詳細講解···):

在JDK1.5以及以前的版本中與Parallel Scavenge收集器搭配使用。

作爲CMS收集器的後備方案,在併發收集Concurent Mode Failure時使用。

  1. ParNew

ParNew收集器其實就是Serial收集器的多線程版本。

除了使用多線程外其餘行爲均和Serial收集器一模一樣(參數控制、收集算法、Stop The World、對象分配規則、回收策略等)。

特點:多線程、ParNew收集器默認開啓的收集線程數與CPU的數量相同,在CPU非常多的環境中,可以使用-XX:ParallelGCThreads參數來限制垃圾收集的線程數。

   和Serial收集器一樣存在Stop The World問題

應用場景:ParNew收集器是許多運行在Server模式下的虛擬機中首選的新生代收集器,因爲它是除了Serial收集器外,唯一一個能與CMS收集器配合工作的

 

  1. CMS

一種以獲取最短回收停頓時間爲目標的收集器。

特點:基於標記-清除算法實現。併發收集、低停頓。

應用場景:適用於注重服務的響應速度,希望系統停頓時間最短,給用戶帶來更好的體驗等場景下。如web程序、b/s服務。

CMS收集器的運行過程分爲下列4步:

初始標記:標記GC Roots能直接到的對象。速度很快但是仍存在Stop The World問題。

併發標記:進行GC Roots Tracing 的過程,找出存活對象且用戶線程可併發執行。

重新標記:爲了修正併發標記期間因用戶程序繼續運行而導致標記產生變動的那一部分對象的標記記錄。仍然存在Stop The World問題。

併發清除:對標記的對象進行清除回收。

 CMS收集器的內存回收過程是與用戶線程一起併發執行的。

 CMS收集器的工作過程圖:

 

 

 

CMS收集器的缺點:

對CPU資源非常敏感。

無法處理浮動垃圾,可能出現Concurrent Model Failure失敗而導致另一次Full GC的產生。

因爲採用標記-清除算法所以會存在空間碎片的問題,導致大對象無法分配空間,不得不提前觸發一次Full GC。