上一节课我讲到了最全JVM垃圾回收算法,分别谈到了新生代和老年代的具体实现算法实现。
算法实现掌握了,那针对于新生代与老年代的具体实现又是怎样的呢?
这就不得不谈到今天的重点:JVM垃圾收集器,也就是JVM垃圾回收算法的具体实现。
为了助大家掌握好JVM垃圾收集器,这节课我会重点讲解以下6点:
1.JVM垃圾收集器
2.JVM收集器类别
3.Serial 串行收集器
4.Parallel并行收集器
5.CMS G1并发收集器
6.ZGC并发收集器
7.JVM垃圾收集器必考点总结
JVM垃圾收集器整体
新生代垃圾收集器
- Serial
- ParNew
- Parallel Scavenge
老年代收集器
- Serial Old
- Parallel Old
- CMS
JVM垃圾收集器类别
隐藏内容,您需要满足以下条件方可查看
End
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
非常完整 ✗咧嘴笑✗ ✗拳头✗
这里我统一补充几个细节点:
1.很多时候其实是想往CMS引导问,比如你上面提到的浮动垃圾,大量的空间碎片(这个是很好的加分项),如果谈到了肯定还会继续问到:Full GC的问题。
2.对于Full GC Minor MajorGC这几个点一定要弄透,比如从Minor到FullGC的全流程以及细节部分(什么时候回收,什么时候到老年代),如果出现了FullGC如何来调优等。
如果把上面两点在课后再补充吃透,基本关于JVM垃圾算法与收集器应该就没有问题了,加油 ✗肌肉✗
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,保证用指定的时间,回收尽可能多的垃圾
基于复制算法,不会产生内存碎片,可预期的停顿,适合大堆、高并发场景
非常完整 ✗咧嘴笑✗ ✗拳头✗
这里我统一补充几个细节点:
1.很多时候其实是想往CMS引导问,比如你上面提到的浮动垃圾,大量的空间碎片(这个是很好的加分项),如果谈到了肯定还会继续问到:Full GC的问题。
2.对于Full GC Minor MajorGC这几个点一定要弄透,比如从Minor到FullGC的全流程以及细节部分(什么时候回收,什么时候到老年代),如果出现了FullGC如何来调优等。
如果把上面两点在课后再补充吃透,基本关于JVM垃圾算法与收集器应该就没有问题了,加油 ✗肌肉✗