64.7款经典的垃圾收集器以及它们之间的组合关系、如何查看默认的垃圾回收器
1.七款经典的垃圾收集器
经典的垃圾回收器又如下7
种:
如下图所示,是经典的垃圾回收器和垃圾分代之间的关系。Serial GC
、Parallel Scavenger GC
以及ParNew GC
只能收集年轻代。Serial Old GC
、Parallel Old GC
以及CMS GC
只能收集老年代。G1 GC
既能收集年轻代又能收集老年代。
2.垃圾收集器之间组合关系
一款年轻代的垃圾收集器总是对应着一款老年代的垃圾收集器。
下面的图更新到了JDK14
。
- 先将虚线看成是实线,一款年轻代的垃圾收集器对应着两款老年代的垃圾收集器。比如说新生代使用
Serial GC
,老年代可以使用CMS GC
或者Serial Old GC
。 - 在老年代,图中的
CMS GC
还对应着Serial Old GC
。Serial Old GC
是CMS GC
的后备方案,因为CMS GC
是并发的垃圾收集器,在进行垃圾回收的时候,用户线程还在工作,用户线程可能还在制造垃圾,如果CMS GC
垃圾回收的速度比用户线程制造垃圾的速度慢,就会回收失败;如果CMS GC
失败会使用Serial Old GC
作为后备方案,进行一次Full GC
。 - 红色的虚线,表示的是在
JDK8
中这种组合被废弃,但是还可以使用;在JDK9
中就被移除了,完全不能使用这两种组合了。绿色虚线表示的是,JDK14
中,这种组合被废弃了。 CMS GC
在JDK14中被移除了。JDK8
中默认的组合是Parallel Scavenger GC
和Parallel Old GC
,JDK9
以后默认的垃圾回收器是G1 GC
。
没有哪一种垃圾回收器可以绝对的说是最好的,不同的场景选择不同的垃圾回收器会更好。
3.查看默认的垃圾收集器
两种方式:
- 执行程序的时候,在
eclipse
的JVM
参数中加入-XX:+PrintCommandLineFlags
- 通过命令行的方式:
jinfo -flag 相关垃圾回收器 java程序进程ID
输出的结果为-XX:+UseParallelGC
,+号表示的是使用了ParallelGC
。如果是减号,就表示的是没有使用。