Hotspot早期的垃圾收集器简介

in Handbook with 0 comment, viewed 56 times

前言

很多人的博文里面会提到JVM三种垃圾收集器:串行,并行和并发。这么分类也不能说错,但事实上也没有这么简单。本文简要介绍Hotspot早期的垃圾收集器(Garbage Collector)。

名词解释

各收集器简介

Our Collectors

上面这张图参考自Oracle官博,每个小方框代表了一种收集器,可以看到,早期的收集器有六种,三个在年轻代,三个在老年代。收集器之间的连线表示了,它们之间是否可以一起工作。

收集器与JVM参数

可以用JVM启动参数来显示指定选择何种收集器。

注意:

  1. 老年代的串行收集器(Serial Old)可以和任意一个年轻代的收集器一起工作。UseSerialGCUseParNewGCUseParallelGC都只指定了年轻代的收集器,老年代默认还是用的串行收集器(Serial Old)。
  2. 为什么打开-XX:+UseConcMarkSweepGC之后,老年代会有两种收集器?前面有说到,CMS采用的标记-清除算法会产生内存碎片,所以当内存碎片化到一定程度之后可能导致无法继续分配新的对象(从年轻代promote上来的对象),此时会触发一次串行的Full GC(带压缩),通常会导致应用程序长时间的停顿。至于为什么不退化成并行收集器(Parallel Old),只能说开发者偷懒了...
  3. -XX:+UseConcMarkSweepGC-XX:+UseSerialGC不能一起使用,否则会报收集器冲突的错。

总结

本文简要介绍了所谓的串行(Serial),并行(Parallel)和并发(CMS)收集器,以及相应的启用参数。因为目前还有很多公司还在用JAVA8甚至之前的版本,所以了解它们还是很有必要的。

参考

Our Collectors

Responses