目录
JVM 垃圾收集器是Java虚拟机(JVM)中至关重要的组件,负责自动管理程序运行时产生的内存分配与回收。垃圾收集器通过检测并回收堆内存中不再使用的对象,从而保证了 Java 应用程序在持续运行过程中拥有足够的内存空间。
如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。各款经典的收集器之间的关系如下图,如果两个收集器之间存在连线,就说明他们可以搭配使用,收集器所处的区域,则表示它是属于新生代还是老年代。
一、Serial收集器
Serial 收集器是最基础、历史最悠久的收集器,这个收集器是单线程工作的收集器,他的“单线程”意义并不仅仅是说明它只会是有一个处理器或一条收集器线程去完成垃圾收集工作,更重要的是强调它在垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。
Serial 收集器依然是 HotSpot 虚拟机运行在客户端模式下的默认新生代收集器,有着优于其他收集器的地方,那就是简单而高效,对于内存资源受限的环境,他是所有收集器里额外内存消耗最小的。
对于单核处理器或处理器核心数较少的环境来说,Serial 收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高单线程收集效率。近年来流行的微服务应用中,分配给虚拟机的内存一般来说并不大,收集十兆甚至几百兆的新生代,垃圾收集的停顿时间完全可以控制在十几、几十毫秒内,只要不是频繁发生收集,是可以接受的。
二、ParNew收集器
ParNew 收集器实质上是 Serial 收集器多线程的并行版本,除了同时使用多线程进行垃圾收集外,其余的行为包括 Serial 收集器可用的所有控制参数都与 Serial 完全一致。
ParNew 除了支持多线程并行收集外,其他与 Serial 收集器相比没有太多创新,除了 Serial收集器外,目前只有它能与 CMS 收集器配合工作。
CMS 收集器是 HotSpot 虚拟机中第一款真正意义上支持并发的垃圾收集器,他首次实现了让垃圾收集线程和用户线程同时工作。
三、Paralle Scavenge
Paralle Scavenge 收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器。
Paralle Scavenge 收集器的特点是它的关注点与其他收集器不同,CMS 等收集器关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而 Paralle Scavenge 收集器的目标则是达到一个可控的吞吐量。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即:
Paralle Scaveng