首页 > 其他分享 >jvm之垃圾收集器

jvm之垃圾收集器

时间:2024-11-10 19:45:47浏览次数:3  
标签:标记 收集器 并发 线程 垃圾 jvm Serial

首先总结下垃圾收集器都有哪些:

  • 回收年轻代的垃圾收集器:Serial、ParNew、Parallel Scavenge。
  • 回收老年代的垃圾收集器:CMS、Serial Old、Parallel Old。
  • 同时回收老年代和年轻代的:G1。

没有一个收集器可以作用于所有的应用场景,只有具体应用选择具体合适的收集器,正是因为如此才会有各种收集器的存在。

Serial收集器

该收集器从名字就可以看出来它为串行垃圾收集器,就是在该收集器工作的时候会暂停掉所有的用户线程,直到收集器工作完成才会正常运行用户线程。serial搭配serial old收集器运行如下:
在这里插入图片描述

  • 缺点:回收需要暂停所有用户线程直到回收结束,暂停时间长。
  • 优点:实现相对简单,对于资源紧张的服务比较好,是客户端模式下默认的垃圾收集器。

ParNew收集器

ParNew是Serial的多线程版本,除了多线程外其它基本上是Serial的复制品,ParNew工作图为:
在这里插入图片描述
如果将CMS作为老年代收集器的话,除了Serial外,只有它可以和CMS收集器配合使用。ParNew收集器是激活CMS后(使用-XX:+UseConcMarkSweepGC选项)的默认新生代垃圾收集器,也可以使用-XX:+/-UseParNewGC选项来强制指定或禁用它。

垃圾收集中并发和并行的概念

  • 并行:并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在工作,通常在这个时候用户线程被暂停处于等待状态。
  • 并发:并发描述的是垃圾收集线程和用户线程之间的关系,说明同一时间垃圾收集线程和用户线程都在运行。由于用户线程和垃圾收集线程同时工作,此时垃圾收集线程会占用一定的处理器资源,这会导致系统的整体吞吐量下降。

Parallel Scavenge收集器

该收集器是以吞吐量优先的并行收集器,就是尽量降低系统的总暂停时间,提高系统的吞吐量就需要减少垃圾收集的停顿频率,频率多会导致系统的总吞吐量降低,频率低可以提高系统的吞吐量,但是伴随而来就是会导致系统的响应时间降低,所以二者不可兼得。

Parallel Scavenge有个-XX:+UseAdaptiveSizePolicy的参数,如果该参数打开后,就不要人工调节新生代大小(-Xmn)、Eden和Survivor区的大小比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间和吞吐量,这个也是它和ParNew收集器的主要区别。

Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同样是个单线程收集器,使用标记整理算法。

Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并行收集,基于标记-整理算法。在注重吞吐量优先的应用当中,Parallel Scavenge和Parallel Old是很好的组合。

CMS收集器

CMS收集器是一种以获取最短回收停顿时间为目标的收集器,也就是它主要关注的是应用的响应时间,基于标记-清除算法,真正的并发垃圾收集器,也就是垃圾收集线程和用户线程并发运行,它回收可以总结为四个过程:

  • 初始标记。
  • 并发标记。
  • 重新标记。
  • 并发清除。

初始标记和重新标记仍然需要Stop the world,初始标记只是标记下与GC Roots能直接关联的对象;并发标记阶段就是从直接关联的对象开始标记整个对象图的过程,比较耗时,不过可以和用户线程并发执行;重新标记是为了标记哪些在用户线程并发运行过程中改变了的引用对象;并发清除就是清理掉已经死亡的对象,由于此过程不需要移动存活对象,所有可以和用户线程并发执行。CMS默认启动的回收线程数为(处理器核心数 + 3)/ 4;
在这里插入图片描述
缺点:并发标记过程会出现浮动垃圾,就是用户线程在并发执行那就会产生新的不用的对象这些就是浮动垃圾,这些垃圾需要在下次触发垃圾回收时才能被清除掉。由于用户线程和垃圾收集线程在并发执行,所以垃圾收集线程会占用一部分处理器资源,会导致应用的吞吐量下降;还有就是CMS收集器和用户线程一起执行,所以需要预留出来一定的空间来为用户线程分配对象,不可能像其他收集器一样等到老年代空间已满的情况下再回收,也就是在老年代已用空间达到某个百分比时就需要开始对象回收工作,如果并发回收过程中,新的对象过来没法分配空间,就会触发保护机制,也就是触发Serial Old收集器收集,这样停顿时间会直接上升,需要根据具体应用的情况来调整这个阈值。另外就是由于CMS是基于标记-清除算法来实现的,所有在每次垃圾收集完了后会产生内存碎片的问题,这个可以通过一个参数来调整-XX:CMSFullGCsBeforeCompaction的值来决定进行几次Full Gc后会触发一次内存整理的工作。

努力!奋斗!进大厂!

标签:标记,收集器,并发,线程,垃圾,jvm,Serial
From: https://blog.csdn.net/qq_41565909/article/details/143656516

相关文章

  • JVM 进阶:深入理解与高级调优
    在学习了JVM的基础知识后,接下来我们将深入了解JVM的内部工作原理、高级优化方法和性能调优技巧,这些内容将帮助你更好地管理Java应用的性能,尤其是在面对大规模应用和高并发场景时。一、深入了解JVM内存结构JVM内存结构的划分和管理直接关系到Java程序的运行效率,深......
  • 思通数科AI平台在智慧城市地面垃圾分类中的项目案例分享
    一、系统概述在当今的城市环境管理中,垃圾分类与识别已成为推动环保与资源回收的重要手段。然而,传统的人工垃圾分类方法耗时、效率低,且容易出错,严重制约了垃圾处理的精细化与可持续发展。思通数科的AI平台专注于解决这一行业痛点。我们的系统通过深度学习和计算机视觉技术,能够精准......
  • 常用的 jvm 调优的参数都有哪些
    ​  堆内存设置-Xms:设置JVM堆的初始大小。例如:​​-Xms2g​​表示初始堆大小为2GB。-Xmx:设置JVM堆的最大大小。例如:​​-Xmx2g​​表示最大堆大小为2GB。-XX:NewRatio:设置年轻代和老年代的比例。例如:​​-XX:NewRatio=4​​表示年轻代和老年代的比例为1......
  • 常用的 jvm 调优的参数都有哪些
       ​ 堆内存设置-Xms:设置JVM堆的初始大小。例如:​​-Xms2g​​表示初始堆大小为2GB。-Xmx:设置JVM堆的最大大小。例如:​​-Xmx2g​​表示最大堆大小为2GB。-XX:NewRatio:设置年轻代和老年代的比例。例如:​​-XX:NewRatio=4​​表示年轻代和老年代的比......
  • springboot毕设 垃圾分类宣传网站 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,生活垃圾产量急剧增加,垃圾分类成为解决城市环境问题、促进资源循环利用的重要手段。然而,公众对垃圾分类知识的了解程度参差不齐,......
  • 深入理解Java虚拟机 --- 垃圾标记/收集算法
    在开始本章之前,我们得了解一个概念,那就是我们怎么知道这个对象是"垃圾"?所以如何定义垃圾就成为我们第一个需要探讨的重要的点之一。垃圾标记算法常见的垃圾标记算法有:引用计数算法和可达性分析算法。引用计数算法实现思路每个对象去额外存储一个引用计数器,这个计数器统计了对......
  • 深入理解Java虚拟机 --- 垃圾回收器
    Serial收集器HotSpot虚拟机运行在客户端模式下的默认新生代收集器。类型:单线程串行垃圾回收器垃圾收集算法:复制算法作用区域:新生代特点:1、只会用单个线程去完成垃圾收集工作,用户线程会STW,直到收集结束。2、没有线程交互,专心做垃圾收集,获得最高的单线程收集效率。ParNew收......
  • 【java编程】深入浅出JVM(四):类文件结构
    原创菜菜的后端私房菜Java文件编译成字节码文件后,通过类加载机制到Java虚拟机中,Java虚拟机能够执行所有符合要求的字节码,因此无论什么语言,只要能够编译成符合要求的字节码文件就能够被Java虚拟机执行.Java虚拟机和字节码是语言、平台无关性的基石.本篇文章将深入浅出的解析......
  • 垃圾场烟雾识别监测系统
    垃圾场烟雾识别监测系统基于AI人工智能机器视觉分析识别技术,垃圾场烟雾识别监测系统通过现场监控摄像头对监控区域内的烟雾进行实时捕捉,利用深度学习算法对图像进行分析处理,准确识别出烟雾和火焰的特征。一旦发现异常情况,系统将立即发出警报,提醒相关人员及时处理,有效规避重大作业......
  • 书接上回说一说 JVM 中的方法区和直接内存
    方法区:在《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上是堆内存的一部分,但一些简单的实现可能不会选择对方法区进行垃圾回收或者进行压缩。但对于HotSpot虚拟机来说,方法区还有一个名字叫Non-Heap(非堆)目的就是要和方法区分开。所以,这样来看,方法区是一块独立于......