当前位置: 首页 > 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] )

相关文章:

CMS与FullGC

JVM中的CMS(Concurrent Mark Sweep)GC和Full GC(Full Garbage Collection)是两种不同的垃圾回收算法。 CMS GC:CMS GC是一种并发的垃圾回收算法,它在运行期间与应用程序线程并发工作,尽可能减少…...

一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner

前言 我们在使用Windows系统的时候经常会遇到一些程序不会释放已分配的内存,从而导致电脑变得缓慢。今天给大家推荐一款.NET开源的小巧、智能、免费的Windows内存清理工具:WinMemoryCleaner。 使用Windows内存清理工具来优化内存,这样不必浪…...

iptables详解:链、表、表链关系、规则的基本使用

目录 防火墙基本概念 什么是防火墙? Netfilter与iptables的关系 链的概念 表的概念 表链关系 规则的概念 查询规则 添加规则 删除iptables中的记录 修改规则 更详细的命令(5链4表) 防火墙基本概念 什么是防火墙? 在…...

安全管理中心(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1系统管理 1.1对系统管…...

Failed to execute org.scala-tools:maven-scala-plugin:2.15.2解决

原因也不是很清楚,查看一个博主文章(net.alchim31.maven:scala-maven-plugin:maven依赖无法下载或无法编译)得到的解决方案: 在idea的terminal执行以下语句即可实现maven对scala代码的编译: mvn clean scala:compile compile pac…...

C#中委托和事件的使用总结

委托(delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。事件是一种特殊的多播委托,仅可以从声明事件的类或结构中对其进行调用。类或对象可以通过事件向其他类或对象通知发生的…...

基于STM32的外部中断(EXTI)在嵌入式系统中的应用

外部中断(External Interrupt,EXTI)是STM32嵌入式系统中常见且重要的功能之一。它允许外部事件(例如按键按下、传感器触发等)通过适当的引脚触发中断,从而应用于各种嵌入式系统中。在STM32微控制器中&#…...

【心得】PHP的文件上传个人笔记

目录 1 php的文件上传绕过 黑名单绕过 2 php文件上传的00截断 3 iconv字符转换异常后造成了字符截断 4 文件后缀是白名单的时候的绕过 web服务器的解析漏洞绕过 5.高级文件上传绕过 1 .htaccess nginx.htaccess 2 服务端内容检测 3 配合伪协议来绕过 4.配合日志包含绕…...

深度学习之基于Pytorch和OCR的识别文本检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介深度学习与OCRPyTorch在OCR中的应用文本检测系统的关键组成部分1. 图像预处理2. 深度学习模型3. 文本检测算法4. 后处理 二、功能三、系统四. 总结 一项目简…...

三十一、W5100S/W5500+RP2040树莓派Pico<TCP_Server多路socket>

文章目录 1 前言2 简介2. 1 使用多路socket的优点2.2 多路socket数据交互原理2.3 多路socket应用场景 3 WIZnet以太网芯片4 多路socket设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 W5100S/W5500是一…...

带你精通chrony服务器

华子目录 为什么会出现Chrony?Linux的两个时钟NTP介绍Chrony介绍安装与配置安装Chrony配置文件分析实验1实验2chronyc命令查看时间服务器chronyc sources输出分析其他命令 常见时区 为什么会出现Chrony? 由于IT系统中,准确的计时非常重要&am…...

vs2017 编译Qt 5.11.2 源码

SDK 10.0.22000.194 有 2种编译方式 ,第二种 看下面 方式一: 1、问题描述: 使用VS编译程序时,运行库选择多线程(/MT),表示采用多线程静态release的方式进行编译。 但是,发现编译是不能通过的…...

【SpringBoot3+Vue3】四【实战篇】-前端(vue基础)

目录 一、项目前置知识 二、使用vscode创建 三、vue介绍 四、局部使用vue 1、快速入门 1.1 需求 1.2 准备工作 1.3 操作 1.3.1 创建html 1.3.2 创建初始html代码 1.3.3 参照官网import vue 1.3.4 创建vue应用实例 1.3.5 准备div 1.3.6 准备用户数据 1.3.7 通过…...

element ui修改select选择框背景色和边框色

一、修改选择框的背景色和边框色 style部分 .custom-select /deep/ .el-input__inner {color: #fff!important;border: 1px solid #326AFF;background: #04308D !important; } html部分 <el-select class"custom-select" v-model"dhvalue" placeholde…...

软件测试人员提问常用的ChatGPT通用提示词模板

如何设计有效的软件测试用例&#xff1f; 如何运用自动化测试工具进行软件测试&#xff1f; 如何进行软件的功能测试、性能测试和安全测试&#xff1f; 如何评估软件测试的质量和覆盖范围&#xff1f; 软件测试有哪些常见的缺陷和错误&#xff0c;如何识别和解决&#xff1…...

【开源】基于JAVA的服装店库存管理系统

项目编号&#xff1a; S 052 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S052&#xff0c;文末获取源码。} 项目编号&#xff1a;S052&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…...

Jenkins代码检测和本地静态检查

1&#xff1a;Jenkins简介 Jenkins是一个用Java编写的开源的持续集成工具&#xff1b;Jenkins自动化部署可以解决集成、测试、部署等重复性的工作&#xff0c;工具集成的效率明显高于人工操作&#xff1b;并且持续集成可以更早的获取代码变更的信息&#xff0c;从而更早的进入测…...

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作&#xff0c;以及文本内容的获取、修改等操作&#xff0c;并通过丰富的示例代码&#xff0c;帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…...

Linux--网络概念

1.什么是网络 1.1 如何看待计算机 我们知道&#xff0c;对于计算机来说&#xff0c;计算机是遵循冯诺依曼体系结构的&#xff08;即把数据从外设移动到内存&#xff0c;再从内存到CPU进行计算&#xff0c;然后返回内存&#xff0c;重新读写到外设中&#xff09;。这是一台计算机…...

C# 中的 Math 数学函数

C# 中的 Math 类提供了许多数学函数&#xff0c;用于执行各种常见的数学运算。以下是 Math 类中的一些常用方法&#xff1a; Math 数学函数 Abs: 返回指定数字的绝对值Acos: 返回指定数字的反余弦值&#xff08;弧度&#xff09;Asin: 返回指定数字的反正弦值&#xff08;弧度&…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...