视频合集

    最全JVM垃圾收集器详解

    • 课程笔记
    • 问答交流

    上一节课我讲到了最全JVM垃圾回收算法,分别谈到了新生代和老年代的具体实现算法实现。
    算法实现掌握了,那针对于新生代与老年代的具体实现又是怎样的呢?
    这就不得不谈到今天的重点:JVM垃圾收集器,也就是JVM垃圾回收算法的具体实现。

    为了助大家掌握好JVM垃圾收集器,这节课我会重点讲解以下6点:

    1.JVM垃圾收集器

    2.JVM收集器类别

    3.Serial 串行收集器

    4.Parallel并行收集器

    5.CMS G1并发收集器

    6.ZGC并发收集器

    7.JVM垃圾收集器必考点总结

    JVM垃圾收集器整体

    最全JVM垃圾收集器详解-mikechen

    新生代垃圾收集器

    最全JVM垃圾收集器详解-mikechen

    • Serial
    • ParNew
    • Parallel Scavenge

    老年代收集器

    最全JVM垃圾收集器详解-mikechen

    • Serial Old
    • Parallel Old
    • CMS

    JVM垃圾收集器类别

    评论交流
    1. 李鸿翼

      1.JVM 常用垃圾收集器有哪些?

      年轻代: Serial串行收集 ParNew 并行收集 Parallel Scavenge并行收集
      老年代: Serial old串行 CMS并发收集器 Parallel Old收集
      g1 收集器

      2.分别谈谈各自收集器的特点?

      Serial :新生代,单线程收集, 复制算法
      Serial old : 老年代, 单线程收集,标记-整理

      ParNew :新生代,多线程收集,复制算法
      CMS并发收集器 :老年代,可用和用户线程并行收集,标记-清除

      Parallel Scavenge :新生代,多线程,追求吞吐量

      Parallel Old : 老年代 ,多线程,标记-整理

      g1: 新生代和老年代都能用,把整个内存划分为多个大小相等的独立区域(region),适用于大内存

      3.最后重点谈谈CMS和G1收集器的工作机制?以及优缺点与应用场景?

      cms:
      执行一次垃圾回收分为4个阶段:
      (1)初始标记, stw, 标记所有GC roots 直接引用的对象, 速度很快
      (2)并发标记 对老年代所有对象进行gc roots追踪,最耗时
      (3)重新标记 stw, 对第二阶段中被系统程序运行变动过的少数对象进行标记,速度很快
      (4)并发清理 清理之前标记的垃圾对象,最耗时

      其中初始标记和重新标记,耗时很短,虽然会导致stw,但影响不大
      并发标记和并发清理,耗时最长,但是可以和系统的工程线程并发运行,对系统影响不大

      CMS ,并发标记和并发清理阶段,会比较消耗CPU资源,并发并发清理阶段会产生“浮动垃圾”,该算法是标记-清除算法,所有会导致内存碎片。

      g1:

      (1)初始标记 ,stw, 标记GC ROOTS 直接能引用的对象,速度快
      (2)并发标记, 追踪所有存活对象,程序可以运行,耗时
      (3)最终标记,stw
      (4)混合回收,从新生代、老年代、大对象挑选一些region,保证用指定的时间,回收尽可能多的垃圾

      基于复制算法,不会产生内存碎片,可预期的停顿,适合大堆、高并发场景

      • mikechen

        非常完整 ✗咧嘴笑✗ ✗拳头✗

        这里我统一补充几个细节点:

        1.很多时候其实是想往CMS引导问,比如你上面提到的浮动垃圾,大量的空间碎片(这个是很好的加分项),如果谈到了肯定还会继续问到:Full GC的问题。

        2.对于Full GC Minor MajorGC这几个点一定要弄透,比如从Minor到FullGC的全流程以及细节部分(什么时候回收,什么时候到老年代),如果出现了FullGC如何来调优等。

        如果把上面两点在课后再补充吃透,基本关于JVM垃圾算法与收集器应该就没有问题了,加油 ✗肌肉✗

    2. 路正银

      1.JVM 常用垃圾收集器有哪些?
      Serial串行垃圾收集器、Serial Old、ParNew并行收集器、Parallel Scavenge并行收集器、Parallel Old、CMS并发收集器、G1收集器

      2.分别谈谈各自收集器的特点?
      Serial串行垃圾收集器 单线程收集器 用户线程STW
      ParNew并行收集器 Serial多线程版本
      Parallel Scavenge并行收集器 追求高吞吐量
      CMS并发收集器 第一款并发处理器 标记-清除算法 会产生空间碎片
      G1收集器 替换CMS 新生+老年代 复制+标记-整理

      3.最后重点谈谈CMS和G1收集器的工作机制?以及优缺点与应用场景?
      CMS收集器,一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现的,整个过程分为4个步骤:
      (1)初始标记(2)并发标记(3)重新标记(4)并发清除,整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
      CMS的三个缺点:(1)CMS收集器对CPU资源非常敏感(2)CMS收集器无法处理浮动垃圾(3)基于“标记-清除”,收集结束时会有大量的空间碎片产生。
      G1收集器,运行步骤:(1)初始标记(2)并发标记(3)最终标记(4)筛选回收
      特点:并行与并发、分代收集、空间整合(基于“标记-整理”)、可预测的停顿
      G1收集器将整个java堆划分为多个大小相等的独立区域(Region),跟踪各个Region里面垃圾堆积的价值大小(回收所获得空间大小以及回收所需的时间经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region

      • mikechen

        非常完整 ✗咧嘴笑✗ ✗拳头✗

        这里我统一补充几个细节点:

        1.很多时候其实是想往CMS引导问,比如你上面提到的浮动垃圾,大量的空间碎片(这个是很好的加分项),如果谈到了肯定还会继续问到:Full GC的问题。

        2.对于Full GC Minor MajorGC这几个点一定要弄透,比如从Minor到FullGC的全流程以及细节部分(什么时候回收,什么时候到老年代),如果出现了FullGC如何来调优等。

        如果把上面两点在课后再补充吃透,基本关于JVM垃圾算法与收集器应该就没有问题了,加油 ✗肌肉✗

    欢迎您,新朋友,感谢参与互动!