java8預設使用的垃圾收集器

flyzer0 發表於 2020-10-16

先說結論:在JDK7u4開始的JDK7u系列與JDK8系列開始,HotSpot VM在選擇使用ParallelGC時,會預設開啟-XX:+UseParallelOldGC,即會使用Parallel Scavenge + Parallel Old組合。

具體可見這篇文章

同時,在官方文件中,也有相關描述,點選此處可見原文

----------------------------------------------------------------------------------------------------------------------------------------------

以下是過程,沒時間的朋友可忽略。

最近在讀《深入理解java虛擬機器:JVM高階特性與最佳實戰》,於是想看看自己電腦的jvm使用的垃圾收集器。百度一番之後,使用命令:java -XX:+PrintCommandLineFlags -version。得到如下結果:

java8預設使用的垃圾收集器

對照書中參數列可知,使用的垃圾收集器組合為:Parallel Scavenge + Serial Old (PS MarkSweep)。

java8預設使用的垃圾收集器

由jconsole.exe也可得到相同的結論。

java8預設使用的垃圾收集器

但是在實際專案裡,啟動命令中我新增-verbose:gc -XX:+PrintGCDetails引數,得到如下結果:

[GC (Allocation Failure) [PSYoungGen: 65024K->7565K(75776K)] 65024K->7581K(249344K), 0.0093773 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] 
[GC (Metadata GC Threshold) [PSYoungGen: 68943K->10178K(75776K)] 68959K->10266K(249344K), 0.0083993 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Metadata GC Threshold) [PSYoungGen: 10178K->0K(75776K)] [ParOldGen: 88K->9852K(111104K)] 10266K->9852K(186880K), [Metaspace: 20647K->20646K(1067008K)], 0.0285451 secs] [Times: user=0.19 sys=0.00, real=0.03 secs] 

由ParOldGen可看出老年代使用的是Parallel Old。這與跟命令列得到的結論不一致。百度之後,找到這樣一篇文章,由此得出本文最開始的結論。而官方文件也對此有所說明。當我在啟動命令中新增:-XX:-UseParallelOldGC後:

[Full GC (Metadata GC Threshold) [PSYoungGen: 10091K->0K(75776K)] [PSOldGen: 88K->9733K(109056K)] 10179K->9733K(184832K), [Metaspace: 20543K->20543K(1067008K)], 0.0282343 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]

說明在使用ParallelGC時,的確開啟了UseParallelOldGC。

以上是本人的觀點,如有錯誤,還望指正。