1、Serial收集器
1、Serial收集器定义
Serial收集器是最基础、历史最悠久的收集器,这个收集器是一个单线程工作的收集器,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。
2、Serial收集器运行示意图
3、Serial收集器应用场景
对于单核处理 器或处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以 获得最高的单线程收集效率。在用户桌面的应用场景以及近年来流行的部分微服务应用中,分配给虚 拟机管理的内存一般来说并不会特别大,收集几十兆甚至一两百兆的新生代(仅仅是指新生代使用的 内存,桌面应用甚少超过这个容量),垃圾收集的停顿时间完全可以控制在十几、几十毫秒,最多一 百多毫秒以内,只要不是频繁发生收集,这点停顿时间对许多用户来说是完全可以接受的。所以,Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择。
2、ParNew收集器
1、ParNew收集器定义?
ParNew收集器实质上是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之 外,其余的行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio、-XX: PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、对象分配规 则、回收策略等都与Serial收集器完全一致,在实现上这两种收集器也共用了相当多的代码。
2、ParNew收集器运行示意图?
3、ParNew收集器应用场景?
除了Serial收集器外,目前只有ParNew收集器能与CMS 收集器配合工作。
CMS 收集器:CMS 收集器为具有划时代意义的垃圾收集器,这款收集器是HotSpot虚拟机中第一款真正意义上支持并发的垃圾收集器,它首次实现了让垃圾收集线程与用户线程(基本上)同时工作。
G1收集器:是一个面向全堆的收集器,不再需要其他新生代收集器的配合工作。所以自JDK 9开始,ParNew加CMS收集器的组合就不再是官方推荐的服务端模式下的收集器解决方案了。官方希望它能完全被G1所取代,甚至还取消了ParNew加Serial Old以及Serial加CMS这两组收集器组合的支持。
3、Parallel Scavenge收集器
1、Parallel Scavenge收集器的定义?
Parallel Scavenge收集器也是一款新生代收集器,它同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器。
2、Parallel Scavenge和ParNew的区别?
Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。
CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间;
3、吞吐量定义
如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了100分钟,其中垃圾收集花掉1分
钟,那吞吐量就是99%。停顿时间越短就越适合需要与用户交互或需要保证服务响应质量的程序,良
好的响应速度能提升用户体验;而高吞吐量则可以最高效率地利用处理器资源,尽快完成程序的运算
任务,主要适合在后台运算而不需要太多交互的分析任务。
4、Parallel Scavenge收集器提供的两个参数?
控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数;
直接设置吞吐量大小的-XX:GCTimeRatio参数。
4、Serial Old收集器
1、Serial Old收集器定义?
Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法。这个收
集器的主要意义也是供客户端模式下的HotSpot虚拟机使用。如果在服务端模式下,它也可能有两种用
途:一种是在JDK 5以及之前的版本中与Parallel Scavenge收集器搭配使用[1],另外一种就是作为CMS
收集器发生失败时的后备预案,在并发收集发生Concurrent Mode Failure时使用。
2、Serial Old收集器运行示意图?
5、Parallel Old收集器
1、Parallel Old收集器的定义?
Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。
2、Parallel Old收集器运行示意图?
6 、*CMS收集器
1、CMS收集器的定义?
CMS收集器是一种以获取最短回收停顿时间为目标的收集器,是基于标记-清除算法实现的。
2、CMS收集器的运作过程?
1)初始标记:初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快;
2)并发标记:就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
3)重新标记:是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;
4)并发清除:清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
3、CMS收集器的运作步骤中并发和需要停顿的阶段?
由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。通过图3-11可以比较清楚地看CMS收集器的运作步骤中并发和需要停顿的阶段。
4、CMS收集器的优缺点?
优点:并发收集、低停顿;
缺点:CMS收集器对处理器资源非常敏感;由于CMS收集器无法处理“浮动垃圾”,有可能出现“Con-current Mode Failure”失败进而导致另一次完全“StopTheWorld”的FullGC的产生;收集结束时会有大量空间碎片产生;
5、应用场景
集中在互联网站或B/S系统服务端上的Java应用
7 、*Garbage First收集器
1、G1收集器的定义?
G1收集器开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。
2、G1收集器运行示意图
3、G1收集器划分独立大小相等的独立区域(Region)?
G1收集器的Mixed GC模式:哪块内存中存放的垃圾数量最多,回收收益最大。
G1开创的基于Region的堆内存布局是它能够实现(哪块内存中存放的垃圾数量最多,回收收益最大。)目标的关键。但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),**每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。**收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。
4、G1收集器的运作过程?
1)初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAM S 指针的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新对象。这个阶段需要 停顿线程,但耗时很短,而且是借用进行Minor GC的时候同步完成的,所以G1收集器在这个阶段实际 并没有额外的停顿。
2)并发标记:并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
3)最终标记(重新标记):因用户程序继续运作而导致标记产生变动的那部分对象的标记记录。
4)筛选回收(并发清除):清理删除掉标记阶段判断的已经死亡的对象
5、应用场景?
面向服务端应用,将来替换CMS