HotSpot 虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,也会适用于不同的分代。不同的分代之间也有对应的关联参数。
1. 垃圾回收器的回顾
1.1 垃圾回收算法
- 复制算法
- 标记-清理算法
- 标记-整理算法
1.2 垃圾回收器
- Serial
- Serial Old
- ParNew
- CMS
- Parallel Scavenge
- Parallel Old
1.3 理解
垃圾回收算法只有三个,但是垃圾回收器有很多。其实垃圾回收器就是对这些算法的包装,然后根据不同的思想进行一定的组合。对单线程和线程进行适配,提高GC的效率,提高用户的体验,以及提高JVM的运行性能等。(一开始总是把垃圾回收算法和垃圾回收器弄混,在这mark一下)
2. 垃圾回收器的组合
垃圾回收器对应的有老年代的和年轻代的,但是他们应该怎么组合才能是效率更高,又或者说那些回收器可以组合到一起,哪些不可以。先看图。
从图中可以看的出来每一种垃圾回收器都不是万金油(除Serial Old外),不可能适配对应区域(老年代或年轻待)的所有垃圾回收器。
- Serial是单线程,并且会stop the world的,他对应到老年代,也就只能是CMS和Serial Old;
- ParNew在GC的时候也会stop the world,但是在Serial上做了优化,可以支持多线程,这个时候就大大的减少了stop the world的时间,可以对应到老年代的CMS和Serial Old收集器;
- Parallel Scavenge更为关注的不是stop the world时间,而是关注程序的吞吐量,这种收集器也被称为“吞吐量优先”收集器,采用的也是多线程,一般用于后端的数据运算且不需要太多交互的任务。对应到老年代分别是Parallel Old和Serial Old。
- 上面的图你可能也注意到了CMS和Serial Old也有连线,因为CMS收集器过程经历了四个阶段分别是初始标记、并发标记、重新标记和并发清除。在经历这四个阶段的时候,如果新的垃圾出现在标记之后,就会无法被清理,会导致浮动垃圾的堆积,只能等待下一次GC过程清理。在CMS的收集过程会预留一部分空间给用户线程运行,这个时候如果出现预留空间不够用,CMS收集就会出现“Concurrent Mode Failure”。为了保证GC,虚拟机预留的后备方案就是启动Serial Old收集器。所以这里CMS和Serial Old是连到一起的。
3. 参数
参数表如下:
参数表说明的很详细,就不细说啦。可以背一背装逼用。(公司里面有人会点虚拟机,没事就在我们面前装逼,这个逼我一定要装回去😏)