JVM中有哪些常见的垃圾回收器?各自的特点是什么?
Java发展至今,已经推出了好几代的垃圾回收器,包括Serial、ParNew、Parallel、CMS、G1以及Java11中最新的ZGC,每一代的GC都是堆上一代的改进和完善。
新生代使用的垃圾回收器主要有:
- Serial串行收集器
(1)单线程收集器,在单核CPU架构下,JDK3之前新生代的回收器的唯一选择。
(2)它与应用线程的执行是串行的,也即是说,执行应用线程的时候,不会执行GC,执行GC的时候不会执行应用
线程。
(3)在CPU单核架构下,Serial串行化收集器情况效果很好,因为采用单个回收线程,在整个回收过程中,没有线程
切换的开销。
(4)现在的大部分都是多CPU的服务器,所以它的使用就很少了。
(5)但是它还是JVM运行在Client模式下的默认垃圾收集器,因为一般桌面应用下新生代空间不是很大,使用这个垃
圾回收器也可以保证回收的时间在100毫秒左右。
- ParNew收集器
(1)Serial串行回收器的多线程版本
(2)在进行回收的过程中,仍然会暂停用户线程(STW),然后利用多核CPU的能力,采用多线程方法进行垃圾回
收
- Parallel scavenge收集器
(1)与ParNew线程一样同样为多线程的垃圾回收器,但是关注吞吐量
(2)提供了自适应的调节策略(也是Parallel scavenge收集器与ParNew收集器的一个重要区别)
老年代使用的垃圾收集器主要有:
- Serial-old收集器
(1)Serial收集器的老年代的版本,同样使用单线程进行垃圾回收
(2)它存在的主要意义是,在JVM运行的client环境下,配合新生代的serial收集器一起使用
(3)它还可以作为CMS垃圾收集器的后备垃圾回收器
- Parallel Old收集器
(1)Parallel scavenge的老年代版本,对内存比较敏感、对吞吐量比较高的场合使用
(2)使用标记-整理算法
-
CMS收集器
(1)真正意义上的并发收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作
(2)是一种以获取最短回收停顿时间为目标的收集器
具体过程:
- 初始标记
- 并发标记
- 重新标记
- 并发清除