jvm_垃圾回收学习笔记_3_常见垃圾回收器

零、前言

    为什么笔者会去学习垃圾回收器呢?只是因为阿里的面试喜欢问这些问题,所以就去了解了下。

一、总体概览

    话不多说,先上图:(图是在网站找的资料,还是自己画一下,加深印象)
HotSpot虚拟机的垃圾收集器
    如上图所示。因为java堆被分为新生代和老年代两块区域,所以在G1和ZGC没有出现之前,新生代和老年代都分别有三款垃圾回收器,并且上图展示了它们之间的搭配关系。下面就分别来介绍一下这些垃圾收集器吧。

二、Serial收集器/Serial Old收集器

    Serial收集器是一款作用于新生代的垃圾收集器,与之对应的老年代收集器是Serial Old收集器。
Serial/Serial Old收集器
    如图所示,Serial和Serial Old都是一个单线程工作的收集器,并且在工作的时候,会阻塞其他的用户线程,出现Stop The Word的现象。当然出现这种现象是不好的!如果你的应用在短时间内一直产生垃圾对象,如导入导出、高并发的场景下,使用这个组合那估计用户线程就一直卡着等待垃圾回收了,用户什么事都做不了,所以一般在生产中都不会使用Serial和Serial Old的组合,并且在新版本的jdk中,Serial Old收集器已经被弃用。
    在JDK9之前,用户还可以选择Serial和CMS组合使用,但是从JDK9开始,Java的开发人员取消这个组合,所以笔者大胆猜测以后Serial收集器也会被废弃。

三、ParNew收集器/Serial Old收集器

    ParNew收集器是一款作用于新生代的垃圾收集器,在Serial Old收集器没有被弃用前默认与之配对,废弃只会默认与CMS收集器组合使用。
在这里插入图片描述
    如图所示,ParNew收集器相比于Serial收集器,是同时使用多个线程进行垃圾回收,但是同样的也会Stop The World,但是效率肯定是比Serial单线程来的高。老版本中默认与Serial Old收集器组合使用,在最新的jdk版本中默认与CMS收集器组合使用。下面重点介绍一下CMS收集器

四、CMS收集器

    CMS收集器的垃圾回收过程分为四个阶段

  1. 初始标记:这个阶段还是单线程工作,Stop The World,但是至少标记GC Roots中能够关联到的对象,速度很快,用户基本无感知。
  2. 并发标记:这个阶段是GC线程和用户线程一起工作的,GC线程重新从GC Roots中的Root对象开始遍历这个对象图,耗时较长,但用户也是无感知的。
  3. 重新标记:重新编辑是为了修正并发标记阶段中用户应进一步操作而导致的对象生命周期发生改变,此时也是Stop The World,但是时间远比并发标记耗时短。
  4. 并发清除:GC线程和用户线程一起工作,GC线程并发的清理垃圾对象。

    个人感觉CMS收集器可能就是在重新标记的时候比较耗时吧,毕竟要和用户线程强资源,估计在高并发的情况下,依然会卡顿很久。并且如果CMS收集器此时正处于并发清除状态下,内存空间又刚好不够用了,此时也会出现应用程序卡顿的现象。但整体来说肯定比Serial Old搜集器效率要高的。并且CMS还有一个缺点,因为它是基于标记-清除算法的,所以每次GC后出现内存碎片的问题,所以有时它不得不进行一次Full GC来进行内存碎片整理,此时又会出现Stop The World的现象。

五、没了,没错,你没看错,就是没了o( ̄︶ ̄)o

猜你喜欢

转载自blog.csdn.net/qq_30752451/article/details/106522940