先说结论:在JDK7u4开始的JDK7u系列与JDK8系列开始,HotSpot VM在选择使用ParallelGC时,会默认开启-XX:+UseParallelOldGC,即会使用Parallel Scavenge + Parallel Old组合。
具体可见这篇文章。
同时,在官方文档中,也有相关描述,点击此处可见原文。
----------------------------------------------------------------------------------------------------------------------------------------------
以下是过程,没时间的朋友可忽略。
最近在读《深入理解java虚拟机:JVM高级特性与最佳实战》,于是想看看自己电脑的jvm使用的垃圾收集器。百度一番之后,使用命令:java -XX:+PrintCommandLineFlags -version。得到如下结果:
对照书中参数表可知,使用的垃圾收集器组合为:Parallel Scavenge + Serial Old (PS MarkSweep)。
由jconsole.exe也可得到相同的结论。
但是在实际项目里,启动命令中我添加-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。
以上是本人的观点,如有错误,还望指正。