当前位置: 首页 > news >正文

CMS与FullGC

JVM中的CMS(Concurrent Mark Sweep)GC和Full GC(Full Garbage Collection)是两种不同的垃圾回收算法。

  1. CMS GC:CMS GC是一种并发的垃圾回收算法,它在运行期间与应用程序线程并发工作,尽可能减少垃圾回收对应用程序的影响。CMS GC主要分为四个阶段:初始标记、并发标记、重新标记和并发清除。它通过标记和清除两个过程来回收垃圾对象,其中标记阶段和应用程序线程并发执行,以减少停顿时间。

  2. Full GC:Full GC是一种非并发的垃圾回收算法,它会停止应用程序的所有线程,对整个堆空间进行垃圾回收。Full GC的目的是回收整个堆空间中所有的垃圾对象,包括年轻代和老年代。Full GC通常在以下情况下发生:当堆空间不足以分配新的对象时,当年轻代无法容纳存活的对象时,或者当老年代的对象达到一定的阈值时。

因此,CMS GC和Full GC的区别主要在于执行方式和影响范围。

  • 执行方式:CMS GC是并发执行的,在垃圾回收的过程中,应用程序线程可以继续运行,减少停顿时间。而Full GC是非并发执行的,会停止应用程序的所有线程进行垃圾回收,会造成较长的停顿时间。

  • 影响范围:CMS GC只对老年代进行垃圾回收,不会对年轻代进行回收。而Full GC会同时回收年轻代和老年代的垃圾对象。

总的来说,CMS GC适用于对停顿时间有严格要求的应用程序,它能够减少垃圾回收对应用程序的影响;而Full GC适用于对吞吐量要求较高的应用程序,它能够彻底回收堆空间中的所有垃圾对象。

在JVM中,CMS GC和Full GC的发生顺序可以是不确定的,取决于垃圾回收器的配置和堆内存的使用情况。一般情况下,CMS GC会先于Full GC发生。

CMS GC是一种增量垃圾回收算法,它在运行期间与应用程序线程并发工作。当老年代空间不足时,CMS GC会触发,并尝试回收老年代中的垃圾对象。如果CMS GC无法回收足够的空间,或者因为应用程序的负载过重导致垃圾回收无法跟上对象分配的速度,那么就会触发Full GC。

Full GC是一种停顿式垃圾回收算法,它会停止应用程序的所有线程进行垃圾回收。Full GC通常在以下情况下发生:当堆空间不足以分配新的对象时,当年轻代无法容纳存活的对象时,或者当老年代的对象达到一定的阈值时。当发生Full GC时,JVM会对整个堆空间进行垃圾回收,包括年轻代和老年代。

需要注意的是,Full GC的发生通常会导致较长的停顿时间,因为它会停止应用程序的所有线程进行垃圾回收。而CMS GC的发生是与应用程序线程并发执行的,可以减少停顿时间。因此,尽量减少Full GC的发生是优化垃圾回收性能的一个重要方向。

在JVM中,Full GC(Full Garbage Collection)并不是单线程的,它通常会使用多线程来进行垃圾回收操作。

Full GC的垃圾回收过程通常包括多个阶段,例如标记、清除、压缩等。在这些阶段中,JVM会利用多个线程来并行处理不同的任务,以加快垃圾回收的速度。

具体地说,Full GC通常会使用多个线程来完成以下任务:

  1. 标记阶段:使用多个线程对堆内存中的对象进行标记,标记出存活的对象。

  2. 清除阶段:使用多个线程对堆内存中的垃圾对象进行清除,释放内存空间。

  3. 压缩阶段:使用多个线程对堆内存中的对象进行压缩,以减少空间碎片化。

通过利用多线程,Full GC能够并行处理不同的垃圾回收任务,从而提高垃圾回收的效率和速度。这也是为什么Full GC的停顿时间相对较长的原因,因为它需要停止应用程序的所有线程,同时利用多线程进行垃圾回收操作。

使用ParNew作为Young区收集器,CMS作为Old区收集器,并将Serial Old作为CMS出错的后备收集器是一种常见的收集器组合。

ParNew收集器是一个多线程的新生代收集器,与Serial收集器类似,但可以充分利用多核CPU的优势,提供更高的吞吐量。

CMS(Concurrent Mark Sweep)收集器是一种以最短回收停顿时间为目标的收集器,通过并发标记和清除的方式来减少停顿时间。

Serial Old收集器是一个单线程的老年代收集器,使用标记-整理算法,适用于小型应用或者只能使用单线程收集器的场景。

当CMS收集器出现问题或无法完成垃圾回收时,会触发一次Full GC操作,此时会使用Serial Old作为后备收集器。Serial Old是一个单线程的收集器,可以保证在Serial Old收集器的单线程环境下进行垃圾回收。

这种组合可以在一定程度上平衡吞吐量和回收停顿时间的需求。

JVM所采用的Old区垃圾收集器为CMS,CMS会在以下几种情况下发生Full GC:

  • 大对象分配到老年代时,可用空间不足
  • perm或metaspace空间不足 (JDK 8 开始HotSpot取消了perm,将类信息存放在metaspace中)
  • 晋升失败:年轻代的存活对象,需要迁移到老年代时,老年代剩余对象不足
  • promotion failed:担保失败,,gc日志会记录信息(如:[ParNew (promotion failed): 1669947K->145784K(1887488K));
  • concurrent mode failure:执行CMS GC的过程中同时业务线程将对象放入老年代,而此时老年代空间不足,或者在做Minor GC的时候,新生代Survivor空间放不下,需要放入老年代,而老年代也放不下而产生的,gc日志会记录信息(如:(concurrent mode failure): 2902473K->1221894K(3354624K), 0.3778980 secs] )

相关文章:

  • 动态规划43(Leetcode91解码方法)
  • JS原生-弹框+阿里巴巴矢量图
  • 华为摄像头通过stm32叠加字符串
  • WPF中Dispatcher对象的用途是什么
  • 分发糖果(贪心算法)
  • VivadoAndTcl: namespace
  • 【Essential C++学习笔记】第四章 基于对象的编程风格
  • SIMULIA-Simpack 2022x新功能介绍
  • 11.16~11.19绘制图表,导入EXCEL中数据,进行拟合
  • 纯JS,RSA,AES,公钥,私钥生成及加解密
  • 基于C++实现循环赛日程表(分治算法)
  • 并发编程之生产者消费者模型
  • Golang环境搭建Win10(简洁版)
  • 栈与队列:设计循环队列
  • ModuleNotFoundError: No module named ‘pycocotools‘
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • es6--symbol
  • GitUp, 你不可错过的秀外慧中的git工具
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • React Transition Group -- Transition 组件
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关于extract.autodesk.io的一些说明
  • 关于springcloud Gateway中的限流
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端性能优化--懒加载和预加载
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 你对linux中grep命令知道多少?
  • elasticsearch-head插件安装
  • ​2021半年盘点,不想你错过的重磅新书
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • .gitignore
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Core 中间件验签
  • .Net FrameWork总结
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net和jar包windows服务部署
  • .net专家(高海东的专栏)
  • /var/spool/postfix/maildrop 下有大量文件
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [Android] Android ActivityManager
  • [android] 手机卫士黑名单功能(ListView优化)
  • [android学习笔记]学习jni编程
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [CSS]CSS 字体属性