JVM垃圾回收——CMS垃圾收集器

news2024/11/15 23:28:10

目录

一、什么是CMS垃圾收集器

二、CMS垃圾收集的过程

三、CMS收集器的不足

四、CMS收集器的参数配置


一、什么是CMS垃圾收集器

        虽然HotSpot虚拟机已经在jdk14中移除了CMS垃圾收集的参数,但是考虑到还有很多开发是基于jdk8开发的,所以还是有必要了解一下CMS垃圾收集器的。CMS(Concurrent Mark Sweep)收集器是一种基于标记清除算法,追求最短停顿时间的真正意义上的第一款并发垃圾收集器。

二、CMS垃圾收集的过程

        

         从上面的图上可以看出,CMS垃圾收集器需要经过初始标记、并发标记、重新标记、并发清除四个阶段。

        初始标记只是标记一下GC Roots能直接关联到的对象,速度很快,这个过程需要STW。

        并发标记就是从GC Roots开始遍历整个对象引用的过程,这个阶段时间较长,但是适合用户线程并发执行的不需要停顿用户线程,这个过程不需要STW。

        重新标记阶段是为了修正并发标记期间,因为用户线程执行而导致标记产生变动(错标、漏标)哪一部分对象(具体的内容可以参考JVM垃圾回收——三色标记法_熟透的蜗牛的博客-CSDN博客),这个阶段停顿时间通常比初始标记时间长,但也远比并发标记时间短,这个过程也需要进行STW。

        并发清除阶段是清理删除标记阶段已被判处死亡的对象,由于基于清除算法,不需要移动存活对象,这个阶段可以和用户线程并发执行。

三、CMS收集器的不足

        仔细想一下CMS虽然是一个和用户线程并发执行的收集器,不需要停顿用户线程或许你会认为这个效果还是挺好的,你这样想那就格局有点小了,虽然在并发阶段不会导致用户线程的停顿,但却占用了CPU,导致用户的应用变慢,导致应用的吞吐量下降,这就是CMS收集器的第一个不足之处,对处理器资源非常敏感。CMS默认启动的回收线程数为(处理器(CPU)核心数+3)/4 ,也就是说如果CPU的核心数在四个或者四个以上,并发回收的垃圾收集线程占用不少于1/4的CPU资源。假设我的服务器是2核的,那么(2+3)/4=1,需要一半的核心数来处理垃圾收集,那这样是个不能接受的问题。

        在CMS并发标记和并发清除阶段,用户线程还是活跃的,自然也会产生新的垃圾对象,那么这些垃圾对象就只能等到下一次垃圾回收的时候才能进行清除,这一部分我们叫做“浮动垃圾”。同样因为并发收集垃圾的原因,CMS收集器需要预留足够的内存空间来存储新的对象,所以CMS收集器并不能像其他收集器一样等到老年代几乎满了之后才会回收垃圾。在jdk5默认当老年代使用达到68%的空间后就会进行垃圾清除,而在jdk6之后这个默认值设定为92%。这个参数可以通过JVM参数-XX:CMSInitiatingOccupancyFraction参数来设定。如果这个值设置的过小垃圾回收就相对频繁,如果设置的过大就会产生“并发失败”(Concurrent Mode Failure),如果出现并发失败,那么JVM就不得不暂停用户线程,临时启用Serial Old收集器来重新进行老年代的回收,这样整个垃圾回收过程就会停顿很长的时间。因此这个值需要在实际生产过程中根据实际情况配置,这是CMS收集器的二一个不足之处。

        三一个不足之处就是CMS是基于标记-清除的算法实现的垃圾收集器,所以CMS垃圾收集会产生大量的空间碎片,由于大量的空间碎片的产生,当分配大对象找不到足够的空间时,就不得不提前进行一次Full GC。为了解决这个问题JVM提供了参数-XX:+UseCMSCompactAtFullCollection参数,这是一个开关参数,默认是开启的,在jdk9之后废弃。

四、CMS收集器的参数配置

测试代码

package com.wssnail.test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 熟透的蜗牛
 * @version 1.0
 * @description: 测试CMS垃圾收集器
 * @date 2022/11/9 21:56
 */
public class TestCMSGc {

    private static String[] strArr = new String[]{"中国人民万岁", "梅西好样的,梅西好样的梅西好样的梅西好样的梅西好样的梅西好样的梅西好样的梅西好样的", "我爱看世界杯,我爱看世界杯我爱看世界杯我爱看世界杯我爱看世界杯我爱看世界杯我爱看世界杯我爱看世界杯我爱看世界杯"};

    public static void main(String[] args) {
        List<String[]> list = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(strArr);
        }
        while (true) {

        }
    }
}

       Jvm参数配置

-Xmx20M
-Xms20M
-Xmn6M
-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=60
-XX:+UseCMSCompactAtFullCollection
-XX:+PrintCommandLineFlags

 打印出明细如下

-XX:CMSInitiatingOccupancyFraction=60 
-XX:InitialHeapSize=20971520 
-XX:MaxHeapSize=20971520 
-XX:MaxNewSize=6291456 
-XX:MaxTenuringThreshold=6 
-XX:NewSize=6291456 
-XX:OldPLABSize=16 
-XX:+PrintCommandLineFlags 
-XX:+PrintGCDetails 
-XX:+UseCMSCompactAtFullCollection 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseConcMarkSweepGC 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParNewGC

-XX:+UseParNewGC,-XX:MaxTenuringThreshold=6 ,可以看出 如果配置了CMS垃圾收集器,默认新生代使用的是ParNewGC收集器,并且复制的次数为6次时会进入老年代,如下两张图

第六次复制

 第七次复制可以看到老年代由2.030M到2.160M

 其他的具体细节,请感兴趣的朋友自己动手实验一下,观察一下CMS垃圾收集的过程。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode17. 电话号码的字母组合

文章目录题目思考代码和注释总结题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 来源&#xff1a;力扣&#xff08;…

【计算机毕业设计】5.网上书店系统maven源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化、网络化和电子化。网上销售&#xff0c;它将是直接市场营销的最新形式。本论文是以构建网上书店系统为…

善网ESG周报(第一期)

ESG报告&#xff1a; 诺基亚最新ESG报告已出炉 报告显示&#xff0c;诺基亚的ESG战略着重于环境、工业数字化、安全和隐私、缩小数字鸿沟、以及企业责任。 Lazada 发布首份ESG报告&#xff1a;为东南亚六国创造约110万经济机会 报告提出&#xff0c;Lazada在区域赋能方面、…

BGP进阶:BGP 综合实验二

实验拓扑及说明 设备编号及互联线路如图所示&#xff1b;所有设备的互联地址段采用10.1.xy.0/24&#xff0c;其中xy为设备编号&#xff0c;x为编号较小的设备&#xff0c;y为编号较大的设备。例如R2及R3之间的直连链路&#xff0c;网段为10.1.23.0/24&#xff0c;这条链路上R2的…

2023年系统规划与设计管理师-第一章信息的综合知识

1. 思维导图 2.信息补充 2.1 信息的传输模型 2.2 信息质量的七大属性 2.3 信息化的基本内涵 2.4 电子商务类型 2.5 电子商务类型 2.6 电子商务的特征 2.7 电子商务的基础设施 2.8 加快商务发展的基本原则 2.9 企业信息化 2.10 信息系统的组成部分 2.11 信息系统的生命周期 2.12…

世界杯 | 中国首次承建世界杯主赛场,基建狂魔用BIM征服世界杯

hi&#xff0c;家人们&#xff0c;我是建模助手。 呐&#xff0c;一如既往地&#xff0c;这次世界杯中国除了球队&#xff0c;其他基本都去了卡塔尔&#xff0c;我可不是在搞幽默&#xff0c;本次世界杯可真是中国元素满满—— 包括但不限于Made in China的纯电大巴、无人驾驶地…

技术分享 | 无人驾驶汽车的眼睛

根据智能化程度的不同&#xff0c;自动驾驶被分为5个等级&#xff1a;L1辅助驾驶、L2部分自动驾驶、L3有条件自动驾驶、L4高度自动驾驶、L5完全自动驾驶&#xff0c;即真正的无人驾驶。 日渐活跃于公众视野的“无人驾驶”概念&#xff0c;往往是指L3及以上级别的自动驾驶。目前…

深度解析为什么做深度学习,都用python,而不用java或者c++

前言 Python是解释语言&#xff0c;这让写程序方便不只一点。举例来说&#xff0c;在C等编译语言里写一个矩阵乘法&#xff0c;需要自己分配操作数&#xff08;矩阵&#xff09;的、分配结果的内存、手动对BLAS接口调用gemm、最后如果没用smart pointer还得手动回收内存空间。P…

看完这篇SpringBoot让我在阿里成功涨薪40%,感谢

前言&#xff1a; SpringBoot的好处是把Java2EE的各项技术的整合变得非常的简单&#xff0c;但是也有它的缺点&#xff0c;它的封装性太强&#xff0c;如果你想了解SpringBoot底层的原理&#xff0c;你必须对SpringMvc、Spring注解等比较了解&#xff0c;你才能更好的去了解Sp…

Jenkins项目中有中文文件出错处理

jenkins build的时候报 ... Malformed input or input contains unmappable characters... 提示是由于项目中有中文文件名&#xff0c;乱码处理不了 ERROR: Build step failed with exception java.nio.file.InvalidPathException: Malformed input or input contains unmappab…

Java学习之继承二细节(学习重点)

目录 继承细节 第一条 父类代码 子类代码 测试代码 运行结果 第二条 第三条 第三条-1 第三条-2 第四条 一、调用父类Base的无参构造器 二、一个参数的构造器 三、两个参数的构造器 第五条 第六条 第七条 第八条 第九条 第十条 继承细节 第一条 子类继承了父类所有的…

用DIV+CSS技术设计的美食主题网站(web前端网页制作课作业)美食餐饮网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

ImmunoChemistry艾美捷总细胞毒性试验试剂盒方案

ImmunoChemistry艾美捷总细胞毒性试验试剂盒是一种单管三色试验&#xff0c;用于定量评估细胞凋亡和坏死引起的细胞介导的细胞溶解活性。该试验采用绿色荧光细胞染色剂CFSE标记靶细胞&#xff0c;红色活/死活力染料7-AAD用于识别细胞毒性试验样品中存在的死细胞&#xff0c;橙红…

【前端验证】fork-join_none线程立即执行的一次代码优化记录

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵&#xff01; 前言 【system verilog】fork-join_none与循环语句共同使用的行为探究 很早之前写过关于fork-join_none的探究文章&#xff0c;最近被人指出了一些错误&#xff1a; 我仔细理解了下他的意思&#xff0c;觉得确实…

电容笔和触控笔有什么区别?平价好用的电容笔排行榜

从导电材料、作用机理、用途等方面来看&#xff0c;电容笔与一般的触摸笔有很大区别。电容笔的笔头设计为中等大小&#xff0c;笔头材料通常更耐磨损。随着技术的发展&#xff0c;人们的生活水平越来越高&#xff0c;人们都想要一支更好用的电容笔&#xff0c;不管是图纸绘画&a…

Java真的不难(五十一)SpringBoot使用EasyExcel实现导出

EasyExcel&#xff1a; 大家好久不见&#xff01; 一、什么是EasyExcel&#xff1f; EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址: https://github.com/alibaba/easyexcel 官方文档地址&#xf…

MAC安装redis的简单方法

使用mac的包管理工具brew一行命令搞定安装。若未安装brew&#xff0c;命令行先输入以下命令安装brew。 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" brew install redis6.2 brew services restart redis6.2 一、安装…

三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot【保姆级】

一、前言 redis在我们企业级开发中是很常见的&#xff0c;但是单个redis不能保证我们的稳定使用&#xff0c;所以我们要建立一个集群。 redis有两种高可用的方案&#xff1a; High availability with Redis Sentinel&#xff08;哨兵&#xff09;Scaling with Redis Cluster&…

FT 在图像处理中的应用

接上文&#xff1a;离散傅里叶变换(DFT) 四、二维傅里叶变换 在此之前&#xff0c;文章都是对 FT 的理论部分的科普推导&#xff0c;距离我们的实际应用还有一定距离 虽然之前提到函数时域时&#xff0c;都是默认我们以时间 t 作为自变量&#xff0c;但事实上自变量也可以是其…

小册上新 | 掌握 SpringBoot 场景整合,成为开发多面手!

只会 SpringBoot 还远远不够 SpringBoot 的强大不言而喻&#xff0c;其底层 SpringFramework 强大的 IOC 容器和 AOP 机制&#xff0c;加之 SpringBoot 的自动装配&#xff0c;使得 SpringBoot 成为当今 JavaEE 开发中最受欢迎&#xff0c;以及使用范围极其广泛的基本技术。 …