在看本文之前,建议先去了解一下几个概念先再来看下文哈,大牛请忽略,哈哈~
所有收集器概括图
下面先给大家看一下所有收集器及其关联的示意图,然后我们再对每个回收器进行讲解:
★★★ 注意:如果两个收集器之间存在连线,就说明它们可以搭配使用
Serial收集器
1、特点:一个单线程的收集器;且运行时必须暂停其他所有的工作线程,直到它收集结束
2、虚拟机运行在Client模式下的默认新生代收集器
3、优点:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
4、缺点:需要停止用户线程,也就是传说中的 “Stop The World”
5、Serial / Serial Old 收集器运行示意图:
注:上面的 “/” 表示的是新生代和老年代分别采用的是什么收集器哈,下面的图也是一样,Serial Old下面会讲,这里注意一下哈~
ParNew收集器
1、特点:ParNew收集器其实就是Serial收集器的多线程版本,只能在新生代中用~
2、优缺点:和Serial收集器时一样的~
3、许多运行在Server模式下的虚拟机中首选的新生代收集器
4、注意的点:该收集器默认的并行度和CPU数量相同
5、ParNew / Serial Old收集器运行示意图:
Parallel Scavenge收集器
1、特点:和ParNew收集器一样,该收集器是在新生代的,也是并行的,也是采用 复制算法
2、和ParNew收集器的区别:Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。
所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
假如虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
3、说明:停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验;
而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
本文的内容和图片参考自:《深入理解Java虚拟机:JVM高级特性与最佳实践》