JVM GC发展史
1、JVM垃圾收集器
jvm发展到现在有这么些垃圾收集器,虽然有些已经被新版本的jdk舍弃了,这两年来更新的jdk中,主要是针对G1与ZGC的容器优化中,其他容器要么被移除,要么被弃用。不过现在市场上的项目很多都停留在jdk1.8阶段,包括面试问题大多数都是以jdk1.8为主要问题版本分析。比如jdk默认的是Parallel Scavenge收集器,默认Parallel Scavenge+Parallel Old GC组合。
1.1、Serial收集器
Serial(串行)收集器收集器是最基本、历史最悠久的垃圾收集器了(在jdk1.3.1版本之前Serial是唯一一个年轻代的GC容器)。大家看名字就知道这个收集器是一个单线程收集器了。它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( “Stop The World” ),直到它收集结束。这就意味着每次GC时都会给用户带来一定的卡顿现象造成不良的用户体验。他相比于其他收集器也有一定的优点:简单而高效(与其他收集器的单线程相比),Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。
新生代采用复制算法,老年代采用标记-整理算法。
1.2、ParNew收集器
可以这样说ParNew就是Serial的一个升级版,除了支持多线程GC回收之外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器完全一样。他是许多运行在Server模式下的虚拟机中首选的新生代收集器,如图中垃圾回收器关系所示除了Serial收集器外,也只有它能与CMS收集器配合工作。
1.3、Parallel Scavenge收集器
此收集器看似与ParNew收集器的功能上类似,但是他们的侧重点不同。Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时