本文所講的是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