65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器

2024-05-29 16:38

本文主要是介绍65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.`Serial`与`Serial Old`垃圾回收器 - 串行回收
  • 2.`ParNew`垃圾收集器 - 并行回收
  • 3.`Paralell Scavenge(吞吐量优先)`与`Parallel Old`垃圾收集器 - 吞吐量优先
  • 4.`CMS`垃圾收集器 - 低延迟

1.SerialSerial Old垃圾回收器 - 串行回收

  1. Serial收集器采用复制算法、串行回收和STW机制的方式回收内存。
  2. Serial Old收集器同样采用串行回收和STW机制,只不过回收算法使用的是标记-压缩算法
  3. HotSpot虚拟机的Client模式下,Serial收集器是年轻代的默认垃圾收集器;Serial Old收集器是老年代的默认垃圾回收器。
  4. HotSpot虚拟机的Server模式下,Serial Old有两个用途,与新生代的Parallel Scavenge配合使用;作为老年代CMS收集器的后备垃圾收集方案。
    在这里插入图片描述
  5. SerialSerial Old垃圾回收器是单线程的垃圾回收器,只有一个收集线程区完成垃圾回收工作,并且在垃圾回收的时候会暂停其他的工作线程。如下图。
    在这里插入图片描述
  6. 优缺点
    简单高效。在单CPU环境,Serial收集器没有线程交互的开销,效率高。在用户的桌面应用场景中,可用内存一般不大,使用Serial收集器可以在较短的时间内完成垃圾收集。
    在这里插入图片描述
  7. 使用-XX:+UseSerialGC参数,可以指定年轻代和老年代都使用串行收集器。

2.ParNew垃圾收集器 - 并行回收

  1. ParNew收集器可以说是Serial收集器的多线程版本。ParParallel的缩写;New表示只能处理新生代。
  2. ParNew收集器除了采用并行回收(也就是多个垃圾收集线程)的方式执行内存回收外,和Serial收集器几乎没有任何区别,也是采用复制算法、STW机制。
    在这里插入图片描述
  3. 对于新生代,回收次数频繁,使用并行回收的方式,效率高。
  4. 对于老年代,回收次数少,使用串行回收的方式,节省线程切换锁消耗的资源,效率高。
  5. 下图中,表示的是,新生代使用的是ParNew收集器,老年代使用的是Serial Old收集器。在JDK9中,Serial Old收集器被移除了,所以就不存在这种组合方式了。当然,ParNew还可以和CMS组合,但是在JDK14中,CMS也被删除了。所以,ParNew很尴尬,成了孤家寡人了。
    在这里插入图片描述
  6. ParNew收集器是不是一定比Serial收集器效率高?
    不一定。
    在这里插入图片描述
  7. 设置使用ParNew收集器以及垃圾收集线程数量
    设置垃圾收集线程数的时候,不要超过CPU的核数。
    在这里插入图片描述

3.Paralell Scavenge(吞吐量优先)Parallel Old垃圾收集器 - 吞吐量优先

  1. 除了ParNew收集器是基于并行回收以外,Parallel Scavenge收集器同样采用了复制算法、并行回收和STW机制。
  2. Parallel Scavenge是不是多此一举?Parallel Scavenge收集器的目标是达到一个可控制的吞吐量(吞吐量优先,用户线程占用的时间更长);以及自适应调节策略也是它与ParNew的重要区别。
    在这里插入图片描述
  3. 刚开始Paralle Scavenge收集器适合Serial Old组合的,在JDK6的时候,发布了Parallel Old收集器,用来替代老年代的Serial Old收集器。
  4. Parallel Old收集器使用标记-压缩算法、并行回收和STW机制进行垃圾回收。
    在这里插入图片描述
  5. JDK8中,默认使用的是Paralle Scavenge收集器和Parallel Old收集器的组合。
  6. Parallel收集器参数设置
    在这里插入图片描述
    在这里插入图片描述
    下面这个参数会自动调节年轻代、Eden区和Survivor区的比例(默认是8:1:1,自动调节之后不是)、晋升老年代的对象年龄等参数都会被自动调整。默认开启自适应调节策略。
    在这里插入图片描述

4.CMS垃圾收集器 - 低延迟

  1. CMS - Concurrent-Mark-Sweep收集器是第一款真正意义上的并发收集器,第一次实现了垃圾收集线程和用户线程同时工作。
  2. CMS垃圾收集器采用标记-清除算法,并且也会STW
    在这里插入图片描述
  3. CMS只能和Serial收集器以及ParNew收集器组合使用。
  4. CMS不能等到内存空间不够的时候,再去进行垃圾回收,需要提前进行垃圾回收。因为垃圾回收的时候和用户线程并发执行,如果,内存空间不够了,再去进行垃圾回收,用户线程和垃圾回收线程都没有足够的空间可用了。

CMS工作原理:
分为四个阶段:初始标记 -> 并发标记 -> 重新标记 -> 并发清理 -> 重置线程。
在这里插入图片描述

  1. 初始标记,仅仅只是标记出与GC Roots能直接关联到的对象。初始标记会STW,但是由于直接关联对象比较小,所以这里速度非常快。
  2. 并发标记,从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时长,不需要停顿用户线程。
    在这里插入图片描述
  3. 重新标记:由于并发标记过程中,工作线程和垃圾收集线程同时运行,因此为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。
  4. 并发清除:清理标记为垃圾的对象,释放内存空间。
    在这里插入图片描述

CMS的弊端:
在这里插入图片描述
在这里插入图片描述
为什么CMS不使用标记-压缩算法?
在这里插入图片描述
CMS优缺点总结:
在这里插入图片描述
浮动垃圾:在并发标记阶段,新产生的垃圾。

CMS收集器参数设置:

在这里插入图片描述
在这里插入图片描述
如何选择Serial GCParallel GCCMS GC?
在这里插入图片描述

更多JVM文章请访问我的JVM专栏:
https://blog.csdn.net/u011069294/category_10113093.html

这篇关于65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014070

相关文章

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器

《2021年最新版大数据面试题全面开启更新》 欢迎关注github《大数据成神之路》 目录 一、概述 二、垃圾收集器(garbage collector (GC)) 是什么? 三、为什么需要GC? 四、为什么需要多种GC? 五、对象存活的判断 六、垃圾回收算法 6.1 标记 -清除算法 6.2 复制算法 6.3 标记-整理算法 6.4 分代收集算法 七、垃圾收集器 7.1 Serial收集器

翻译论文的关键部分 | Parallel Tiled QR Factorization for Multicore Architectures

SSRFB DTSQT2 DLARFB DGEQT2 1, 对角子矩阵分解 DGEQT2 这个例程被开发出来,用于针对对角Tile子矩阵: ,执行不分块的QR分解。 这个运算产生: 一个上三角矩阵 一个酉下三角矩阵,这个矩阵包含 b 个 Householder 反光面、 一个上三角矩阵 ,在WY技术中,这个矩阵被定义用来累计Householder变换。 和 能够写进 所占据的内存空间,

SEO之网站结构优化(十五-CMS系统)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 15、CMS系统 现在的网站绝大多数是通过CMS系统制作和管理的,SEO人员优化网站就会受限于CMS 系统本身的灵活性和功能。市面上有很多开源免费的CMS系统,如中文的dede(织梦)、

65-java中sleep方法和wait方法的区别

‌Java中的sleep()方法和wait()方法的主要区别在于它们的所属类、使用方式、唤醒机制、锁的处理、异常处理以及用途。‌   ‌所属类不同‌:sleep()方法是Thread类的静态方法,可以在任何线程中使用。而wait()方法是Object类的一个实例方法,只能在同步代码块或同步方法中使用。‌12   ‌使用方式不同‌:sleep()方法用于使线程暂停执行指定的时间,不需要任何条件即可

EasyConnect 现实 Harfbuzz version too old 解决方案

https://www.cnblogs.com/cocode/p/12890684.html

JVM性能调优之5种垃圾收集器

JDK垃圾收集器 一、Serial GC垃圾收集器Serial GC的工作原理Serial GC的特点Serial GC的配置参数Serial GC的适用场景Serial GC的优缺点优点:缺点: Serial GC的总结 二、Parallel GC垃圾收集器Parallel GC的工作原理Parallel GC的特点Parallel GC的配置参数Parallel GC的适用场景Paral

【codeforces】gym 101137 K - Knights of the Old Republic【用最小生成树对图做集合dp】

题目链接:【codeforces】gym 101137 K - Knights of the Old Republic 考虑对图集合dp,一个连通块的dp值为两个连通块的值的和或者强制加一条新边后的最小值,取个最小值(边从小到大枚举,则强制加一条最大的边会导致连通块内较小的边一定都选,则会构成一个生成树)。用kruskal实现这个dp过程即可。 #include <bits/stdc++.h>

Android studio Plugin is too old 问题

Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to ........ 将默认的  classpath 'com.android.tools.build:gradle:2.2.0-beta2' 修改成 clas