深入理解java虛擬機(五):hotspot垃圾收集算法實現

本文所講的是sun hotspot虛擬機實現,主要講解Serial,ParNew,Parallel Scavenge,Serial Old,CMS(Concurrent Marsk Sweep),Parallel  Old,G1(garbage first)垃圾收集器。

先看java堆內存結構,適用於非G1收集器外的垃圾收集器:


 

首先根據java對象的生存週期長短把java堆內存分成老年代和年輕代,新年代大小可以通過參數 -Xmn10M來控制
 然後年輕代又被分成3塊,一個Eden區,兩個大小相等的survivor區,Eden區和Survivor區的大小可以通過參數 -XX:SurvivorRatio=8來進行控制
在垃圾收集領域有個很有意思的語句“Stop the world”,原因是當執行垃圾回收時需要停止所有的用戶線程。

1、Serial收集器

 年輕代收集器。
 採用複製算法
 顧名思義它是個單線程的收集器。Client模式下虛擬機新生代默認收集器

2、ParNew收集器

年輕代收集器。
 採用複製算法
 其實就是Serial收集器的多線程版本。
 Server模式下虛擬機新生代默認收集器。
 ParNew收集器也是使用 -XX:+UseConcMarkSwepGC選項後默認的新生代收集器,也可以使用-XX:+UseParNewGC選項來強制指定它。
 它默認開啓的收集線程與CPU的數量相同,可以通過-XX:ParallelGCThreads參數來限制垃圾收集線程數。

3、Parallel Scavenge收集器

 年輕代收集器。
 採用複製算法
 並行收集器。
 關注點是達到一個可控制的吞吐量(吞吐量優先),而非其他收集器的儘可能縮短垃圾收集時用戶線程的等待時間。
 所謂吞吐量就是CPU運行用戶代碼的時間和總耗時的比值,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)。
 參數 -XX:MaxGCPauseMillis參數用於控制最大垃圾收集停頓時間。
 參數 -XX:GCTimeRatio直接設置吞吐量大小(垃圾收集時間比率,吞吐量的倒數)。

4、Serial Old收集器

老年代收集器。
 採用標記-整理算法。
 單線程,類似於Serial收集器。
 Client模式下虛擬機默認的老年代收集器

5、Parallel  Old收集器

 老年代收集器。
 採用標記-整理算法。
 多線程,類似於Parallel Scavenge收集器。
 與Parallel Scavenge收集器搭配使用。

6、CMS收集器

 老年代收集器。
 採用標記-清除算法。
 獲取最短回收停頓時間爲目的。
 整個過程分爲4個步驟:
       初始標記
       併發標記
       重新標記
       併發清除
 其中,初始標記和重新標記這兩步驟仍然需要“Stop the world”。
 默認啓用的回收線程數是(CPU數量+3)/4。
 參數 -XX:CMSInitiatingOccupancyFraction的值來觸發垃圾收集。

7、G1(garbage first)收集器

 當今收集器技術的發展最前沿技術。
 從jdk1.7發佈。

 

附: JVM 內存佈局以及垃圾收集及管理詳解  http://blog.csdn.net/chaofanwei/article/details/12028831

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章