JVM之新生代垃圾收集器

737 阅读3分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。

经典垃圾收集器

如果收集算法内存回收的方法论,那么垃圾收集器就是内存回收的实践者。因为不存在既定的标准,所以不同厂商的垃圾收集器也大都不相同,且提供各种参数供用户根据自己的应用和要求组合出各个分代所要使用的收集器。

因为垃圾收集器不存在万能的收集器,所以我们需要对相应场景选择最适合的收集器。

Serial 收集器

Serial收集器是最基础、历史最悠久的收集器,在JDK1.3.1之前是HotSpot虚拟机新生代收集器的唯一选择。该收集器在进行收集工作的时候必须暂停其他所有工作线程,直到它收集结束。暂停其他所有工作线程的任务是在用户不可知、不可控的情况下把用户的正常工作线程全部停掉的。

不过它现在还是HotSpot客户端模式下默认的新生代收集器,因为其简单又高效,其额外内存消耗比较小,因为没有线程交叉的开销,所以其单线程收集的效率很高。而且桌面应用的新生代对象使用的内存一般不是很大,垃圾收集停顿时间完全可以控制在十几、几十毫秒。

image.png

ParNew收集器

ParNew实质上是Serial收集器的多线程版本,该收集器也是新生代垃圾收集器,基于标记-复制算法实现垃圾收集,除了同时使用多线程进行垃圾收集外,两者在其他方面基本上相同,而且两个收集器共用了相当多的代码。该收集器是不少运行在服务端模式下的HotSpot虚拟机,主要是只有它可以和CMS收集器配合使用。

由于更高性能的G1垃圾收集器的出现,ParNew收集器从JDK9开始就只能和CMS收集器搭配联合工作,而且也不再是官方推荐的服务器端模式下的收集器解决方案了。

Parallel Scavenge收集器

Parallel Scavenge收集器也是一款新生代收集器,而且也基于标记-复制算法实现的能够并行收集的多线程垃圾收集器。

该垃圾收集器的特定是,其关注点是吞吐量,而不是用户线程的停顿时间。因此Parallel Scanvenge垃圾收集器也被称为吞吐量优先收集器。此外其还可以开启自适应的调节策略,动态调节新生代大小、Eden与Survivor区域大小以及晋升老年代对象大小等参数并提供最合适的停顿时间或最大的吞吐量。

结语

今儿先介绍以上这几个经典的新生代垃圾收集器,之后在进一步介绍其他的几个经典的老年代的垃圾收集器(Serial Old、Parallel Old、CMS)。