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

相关文章

垃圾回收器——CMS收集器

CMS[Concurrent Mark Sweep]收集器是一种以获取最短回收停顿时间为目标的收集器。  目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的相应速度. 从名字就可以看出,CMS收集器是使用的标记清除算法,它的运作过程相当于前面几种收集器来说更为复杂,整个过程分为四个步骤: 初始标记,标记一下GC Roots能直接关联到的对象,速度很快

CMS收集器配置

HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间。该目标对于大多数交互式应用很重要,比如web应用。在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器的操作和使用它时可能出现的主要挑战。 就像吞吐量收集器(参见本系列的第6部分),CMS收集器处理老年代的对象,然而其操作要复杂得多。吞吐量收集器总是暂停应用程序线程,并且可能是相当长的一段时间,

JVM(HotSpot) 7种垃圾收集器

JVM(HotSpot) 7种垃圾收集器的特点及使用场景 这里讨论的收集器基于JDK1.7Update 14之后的HotSpot虚拟机,这个虚拟机包含的所有收集器如下图3-5所示:   上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。   1.Serial收集器 Serial收集器是最基本、发展历史最悠久的收集器。是单线程的收集

Java常用垃圾收集器

垃圾收集器 Serial 单线程,使用复制算法用于新生代的垃圾回收进行GC时必须暂停所有其他工作线程适用于内存不太大的桌面应用 Serial Old Serial的老年代版本单线程,使用标记-整理算法 ParNew Serial的多线程版本,可与CMS配合使用用于新生代的垃圾回收CPU数量多的时候才能发挥优势,适用于Server上的应用 Parallel Scavenge 目标上达

TX2 关闭console serial使用该串口

由于项目变更,GPU型号从Tx1变成Tx2,原来的硬件接口没有变,但是把原来UART0的console serial功能关闭变成一个串口使用的方法没法使用了。这就导致了数据通过该串口发送的数据变的很有问题,无法使用了。 经过测试,终于找到了解决的方法。 首先在虚拟机上,安装编辑设备树的软件: $sudo apt-get update $sudo apt-get install device

uni-CMS:全端开源内容管理系统的技术探索

摘要 本文介绍了uni-CMS,一个基于uniCloud开发的开源内容管理系统(CMS)。该系统旨在帮助开发者快速搭建并管理内容丰富的网站、小程序和移动应用。通过其全端渲染、内容安全检测、广告解锁付费内容以及AI生成文章等特性,uni-CMS不仅提高了开发效率,还促进了内容生产效率的提升和变现能力的增强。本文详细探讨了uni-CMS的技术架构、功能特性以及实施步骤,为开发者提供了一个全面的技术参

【教学类65-02】20240622秘密花园涂色书02(通义万相)(A4横版2张,一大 68张纸136份)

背景需求 【教学类65-01】20240622秘密花园涂色书01(通义万相)(A4横版2张,一大3小 38张纸76份)-CSDN博客文章浏览阅读118次。【教学类65-01】20240622秘密花园涂色书01(通义万相)(A4横版2张,一大3小 38张纸76份)https://blog.csdn.net/reasonsummer/article/details/139899797 以上

“*** error 65: access violation at 0x40021000 : no 'read' permission”错误的解决

错误原因: 在Keil5下面进行模拟运行的时候总是点击一下Run,程序才走一步,还从时钟配置里面出不来。 解决办法: 第一种方法 : Option->Debug->Use_Simulator->Initialization_File,打开并新建一个.ini文件,里面写上map 0x40000000,0x400FFFFF read write保存即可(MAP不区分大小写,注意read和wri

Golang笔记:使用serial包进行串口通讯

文章目录 目的使用入门总结 目的 串口是非常常用的一种电脑与设备交互的接口。这篇文章将介绍golang中相关功能的使用。 本文使用的包为 :go.bug.st/serial https://pkg.go.dev/go.bug.st/serial https://github.com/bugst/go-serial 另外还有一些常见的包如:tarm/serial https:/

platformio烧写STC8H1K08单片机程序失败:Serial port error: read timeout

问题 在使用platformio进行STC8H1K08单片机开发,在烧录编译好的程序时失败了,烧录过程日志如下: * 正在执行任务: C:\Users\23043036\.platformio\penv\Scripts\platformio.exe run --target upload Processing STC8H1K08 (platform: intel_mcs51; board: