新生代默認垃圾回收算法:標記複製
老年代默認回收算法:標記整理
Minor GC和Full GC
Minor GC只針對新生代,觸發條件:當Eden區滿時,觸發Minor GC。
Full GC包含新生代和老年代,觸發條件:
(1)調用System.gc時,系統建議執行Full GC,但是不必然執行
(2)老年代空間不足
(3)方法區空間不足
(4)通過Minor GC後進入老年代的平均大小大於老年代的可用內存
(5)由Eden區、From Space區向To Space區複製時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小。
接下里我們需要查看Java8默認的GC收集器:
查看Java8默認的GC收集器
java -XX:+PrintCommandLineFlags -version
結果如下圖:
-XX:+UseParallelGC實際上是Parallel Scavenge (新生代)+ Parallel Old(老年代)。
查看GC詳情
java -XX:+PrintGCDetails -version
結果如下
下面我們來講一下GC收集器
新生代:
1.serial收集器
單線程,工作時必須暫停其他工作線程。多用於client機器上,使用複製算法
2、ParNew收集器
serial收集器的多線程版本,server模式下虛擬機首選的新生代收集器。複製算法
3、Parallel Scavenge收集器
複製算法,可控制吞吐量的收集器。吞吐量即有效運行時間。
老年代:
4、Serial Old收集器
serial的老年代版本,使用整理算法。
5、Parallel Old收集器
第三種收集器的老年代版本,多線程,標記整理
6、CMS收集器
目標是最短回收停頓時間。
7、G1收集器
基本思想是化整爲零,將堆分爲多個Region,優先收集回收價值最大的Region。
垃圾回收器的選擇策略:
1、單CPU或者小內存,單機程序 — -XX:+UseSerialGC
2、多CPU,需要大吞吐量,如後臺計算型應用
-XX:+UseParallelGC + -XX:+UseParallelOldGC
3、多CPU,追求低停頓時間,快速響應如互聯網應用
-XX:+UseParNewGC + -XX:+UseConcMarkSweepGC