本文主要是介绍65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1.`Serial`与`Serial Old`垃圾回收器 - 串行回收
- 2.`ParNew`垃圾收集器 - 并行回收
- 3.`Paralell Scavenge(吞吐量优先)`与`Parallel Old`垃圾收集器 - 吞吐量优先
- 4.`CMS`垃圾收集器 - 低延迟
1.Serial
与Serial Old
垃圾回收器 - 串行回收
Serial
收集器采用复制算法
、串行回收和STW
机制的方式回收内存。Serial Old
收集器同样采用串行回收和STW
机制,只不过回收算法使用的是标记-压缩算法
。- 在
HotSpot
虚拟机的Client
模式下,Serial
收集器是年轻代的默认垃圾收集器;Serial Old
收集器是老年代的默认垃圾回收器。 - 在
HotSpot
虚拟机的Server
模式下,Serial Old
有两个用途,与新生代的Parallel Scavenge
配合使用;作为老年代CMS
收集器的后备垃圾收集方案。
Serial
与Serial Old
垃圾回收器是单线程的垃圾回收器,只有一个收集线程区完成垃圾回收工作,并且在垃圾回收的时候会暂停其他的工作线程。如下图。
- 优缺点
简单高效。在单CPU
环境,Serial
收集器没有线程交互的开销,效率高。在用户的桌面应用场景中,可用内存一般不大,使用Serial
收集器可以在较短的时间内完成垃圾收集。
- 使用
-XX:+UseSerialGC
参数,可以指定年轻代和老年代都使用串行收集器。
2.ParNew
垃圾收集器 - 并行回收
ParNew
收集器可以说是Serial
收集器的多线程版本。Par
是Parallel
的缩写;New
表示只能处理新生代。ParNew
收集器除了采用并行回收(也就是多个垃圾收集线程)
的方式执行内存回收外,和Serial
收集器几乎没有任何区别,也是采用复制算法、STW
机制。
- 对于新生代,回收次数频繁,使用并行回收的方式,效率高。
- 对于老年代,回收次数少,使用串行回收的方式,节省线程切换锁消耗的资源,效率高。
- 下图中,表示的是,新生代使用的是
ParNew
收集器,老年代使用的是Serial Old
收集器。在JDK9
中,Serial Old
收集器被移除了,所以就不存在这种组合方式了。当然,ParNew
还可以和CMS
组合,但是在JDK14
中,CMS
也被删除了。所以,ParNew
很尴尬,成了孤家寡人了。
ParNew
收集器是不是一定比Serial
收集器效率高?
不一定。
- 设置使用
ParNew
收集器以及垃圾收集线程数量
设置垃圾收集线程数的时候,不要超过CPU
的核数。
3.Paralell Scavenge(吞吐量优先)
与Parallel Old
垃圾收集器 - 吞吐量优先
- 除了
ParNew
收集器是基于并行回收以外,Parallel Scavenge
收集器同样采用了复制算法、并行回收和STW
机制。 Parallel Scavenge
是不是多此一举?Parallel Scavenge
收集器的目标是达到一个可控制的吞吐量(吞吐量优先,用户线程占用的时间更长);以及自适应调节策略也是它与ParNew
的重要区别。
- 刚开始
Paralle Scavenge
收集器适合Serial Old
组合的,在JDK6
的时候,发布了Parallel Old
收集器,用来替代老年代的Serial Old
收集器。 Parallel Old
收集器使用标记-压缩算法、并行回收和STW
机制进行垃圾回收。
JDK8
中,默认使用的是Paralle Scavenge
收集器和Parallel Old
收集器的组合。Parallel
收集器参数设置
下面这个参数会自动调节年轻代、Eden区和Survivor区的比例(默认是8:1:1
,自动调节之后不是)、晋升老年代的对象年龄等参数都会被自动调整。默认开启自适应调节策略。
4.CMS
垃圾收集器 - 低延迟
CMS - Concurrent-Mark-Sweep
收集器是第一款真正意义上的并发
收集器,第一次实现了垃圾收集线程和用户线程同时工作。CMS
垃圾收集器采用标记-清除算法,并且也会STW
。
CMS
只能和Serial
收集器以及ParNew
收集器组合使用。- CMS不能等到内存空间不够的时候,再去进行垃圾回收,需要提前进行垃圾回收。因为垃圾回收的时候和用户线程并发执行,如果,内存空间不够了,再去进行垃圾回收,用户线程和垃圾回收线程都没有足够的空间可用了。
CMS
工作原理:
分为四个阶段:初始标记 -> 并发标记 -> 重新标记 -> 并发清理 -> 重置线程。
- 初始标记,仅仅只是标记出与
GC Roots
能直接关联到的对象。初始标记会STW
,但是由于直接关联对象比较小,所以这里速度非常快。 - 并发标记,从
GC Roots
的直接关联对象开始遍历整个对象图的过程,这个过程耗时长,不需要停顿用户线程。
- 重新标记:由于并发标记过程中,工作线程和垃圾收集线程同时运行,因此为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。
- 并发清除:清理标记为垃圾的对象,释放内存空间。
CMS
的弊端:
为什么CMS
不使用标记-压缩算法?
CMS
优缺点总结:
浮动垃圾:在并发标记阶段,新产生的垃圾。
CMS
收集器参数设置:
如何选择Serial GC
和Parallel GC
和CMS GC
?
更多JVM文章请访问我的JVM专栏:
https://blog.csdn.net/u011069294/category_10113093.html
这篇关于65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!