面试题:JVM 默认垃圾回收器是什么
要回答这个问题,自己写个Hello World测试一下就知道了,下面是在JDK8环境下测试
# 生成 Demo.java 文件
$ cat > Demo.java << eof
public class Demo {
> public static void main(String[] args){
> System.out.println("hello...");
> }
> }
> eof
# 编译出 Demo.class
$ javac Demo.java
# 执行 Demo.class
$ java -XX:+PrintCommandLineFlags Demo
-XX:InitialHeapSize=252930560 -XX:MaxHeapSize=4046888960 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
hello...
# 直接看看默认的参数配置
$ java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=252930560 -XX:MaxHeapSize=4046888960 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
可以看到上面有一个-XX:+UseParallelGC
参数,那么这个参数是什么意思?
周志明的《深入理解Java虚拟机 第3版》3.7.4章节 垃圾收集器参数总结给出了答案:
参数 | 描述 |
---|---|
UseParallel GC | JDK 9 之前虚拟机运行在Server模式下的默认值,打开此开关后,使用 Parallel Scavenge + Serial Old (PS MarkSweep)[1] 的收集器组合进行内存回收 |
所以答案是:
Parallel Scavenge + Serial Old
需要说明一下, Parallel Scavenge收集器架构中本身有PS MarkSweep收集器来进行老年代收集, 并非直接调用Serial Old收集器, 但是这个PS MarkSweep收集器与Serial Old的实现几乎是一样的, 所以在官方的许多资料中都是直接以Serial Old代替PS MarkSweep进行讲解, 这里笔者(周志明)也采用这种方式。 ↩︎