常见的垃圾回收器如下:
新生代收集器有Serial、ParNew、Parallel Scavenge;
老年代收集器有Serial Old、Parallel Old、CMS。
整堆收集器有G1、ZGC
Serial是单线程的串行垃圾回收器,主要采用**<font style="color:#213BC0;">标记-复制算法</font>**
进行垃圾回收。
单线程地好处就是减少上下文切换,减少系统资源的开销。但这种方式的缺点也很明显,在GC的过程中,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(Stop The World)。若GC不是频繁发生,这或许是一个不错的选择,否则将会影响程序的执行性能。
Serial Old是Serial的老年代版本,也是个单线程收集器,适用于老年代,使用的是**<font style="color:#AE146E;">标记-整理算法</font>**
。
优缺点基本和Serial差不多,二者主要是回收算法不一样。
ParNew其实就是Serial的多线程版本,在参数、回收算法上,和Serial是完全一样的,所以他也是采用**<font style="color:#213BC0;">标记-复制算法</font>**
进行垃圾回收的。**
ParNew在垃圾回收的时候,同样会STW,但是因为它是多线程并行进行垃圾回收的,所以通常情况下时间会比Serial短一些。
Parallel Scavenge 也是一个新生代的垃圾回收器,和ParNew一样,他也是多线程并行执行的,同样采用的也是**<font style="color:#213BC0;">标记-复制算法</font>**
。与ParNew最大的不同是,Parallel Scavenge 关注的是垃圾回收的吞吐量(吞吐量=代码运行时间/(代码运行时间+垃圾收集时间),以吞吐量优先。
因为Parallel Scavenge收集器的高吞吐量可以最高效率的利用CPU时间,尽快的完成程序的运算任务等,所以他主要适合在后台运算,比如一些定时任务的执行。
Parallel 是 Parallel Scavenge的老年代版本,同样是一个关注吞吐量的并行垃圾收集器,他采用的是**<font style="color:#AE146E;">标记-整理算法</font>**
算法进行垃圾回收的。
CMS,Concurrent Mark Sweep,同样是老年代的收集器。他也是一个并发执行的垃圾收集器,他和Parallel最大的区别是他更加关注垃圾回收的停顿时间,通过他的名字Concurrent Mark Sweep就可以知道,他采用的是耗时更短的**<font style="color:#5C8D07;">标记-清除算法</font>**
。