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

news/2024/5/18 18:24:04/文章来源:https://blog.csdn.net/weixin_39555954/article/details/127896135

目录

一、什么是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.luyixian.cn/news_show_224884.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-难点突破(C++实现并查集+路径优化,详解哈夫曼编码树)

文章目录1. 并查集2. 哈夫曼编码树1. 并查集 并查集是一个多棵树的集合&#xff08;森林&#xff09;。 并查集由多个集合构成&#xff0c;每一个集合就是一颗树。 并&#xff1a;合并多个集合。查&#xff1a;判断两个值是否再一个集合中。 每棵树存在数组中&#xff0c;使…

集世界杯+GameFi元素的MetaElfLand,为何将在世界杯期间爆发?

又到了四年一度的球迷狂欢节&#xff0c;本次卡塔尔世界杯已于11月21号举行。 每当世界杯来临&#xff0c;与世界杯相关产业都会迎来一波爆发&#xff0c;毕竟这个千亿美金市值的市场暗藏着无数的机会。而自GameFi的火热开始&#xff0c;世界杯也成为了加密投资者的狂欢日&…

pytorch的buffer学习整理

pytorch模型中的buffer 这段时间忙于做项目&#xff0c;但是在项目中一直在模型构建中遇到buffer数据&#xff0c;所以花点时间整理下模型中的parameter和buffer数据的区别&#x1f495; 1.torch.nn.Module.named_buffers(prefix‘‘, recurseTrue) 贴上pytorch官网对其的说…

分布式文件系统HDFS实践及原理详解part3

HDFS原理 说明&#xff1a;3.5开头目录是因为和上篇文章内容同属一章&#xff0c;所以开头使用了3.5 3.5 HDFS核心设计 3.5.1 心跳机制 1、 Hadoop 是 Master/Slave 结构&#xff0c;Master 中有 NameNode 和 ResourceManager&#xff0c;Slave 中有 Datanode 和 NodeManag…

异构网络小入

A Survey of Heterogeneous Information Network Analysis Heterogeneous Graph Attention Network 异构网络很火吗&#xff1f; 在一个网络中&#xff0c;不用节点的类型不同&#xff0c;这是肯定的。 所以&#xff0c;异构网络在表征比较复杂的情形时&#xff0c;是比较合适…

基于图像识别的小车智能寻迹控制系统

目录 摘要…… I Abstract II 基于图像识别的智能寻迹控制系统设计 I Design of Intelligent tracking Control system based on Image recognition II 目录 III 第1章 绪论 1 1.1 课题背景 1 1.1 国内外文献综述 1 1.2 论文研究内容 2 第2章 基于图像识别的智能寻迹控制系统方…

【安装Ubuntu18.04遇到的问题】未找到WIFI适配器

大家好&#xff0c;我是小政。好久没有更新文章&#xff0c;近期开始陆续分享一些研究生阶段正在学习的知识和遇到的一些问题。 联想拯救者Y9000P关于安装Ubuntu未找到WIFI适配器的解决方法1.Ubuntu18.042.网卡信息3.解决方法&#xff08;1&#xff09;用手机USB连接电脑提供网…

动态规划--树型dp

6个题1. 树的最长路径2.树的中点.由于第三题需要用到一些数学地知识&#xff0c;所以先去补一补数学知识。连接链接在这里4.二叉苹果树5.战略游戏6.皇宫守卫1. 树的最长路径 定义&#xff1a;树中两个点直接的最远距离称为树的直径 先说一个结论 先任意找到一个树中一个点u&am…

分布式协调系统ZooKeeper实践与原理剖析

基础的一些知识&#xff0c;高阶知识后续看看补充 第一章 ZooKeeper概述 1.1 介绍 What is ZooKeeper&#xff1f; Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination ZooKeeper is…

大学生静态HTML网页设计--公司官网首页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#xf…

SpringIoc依赖查找-5

1. 依赖查找的今世前生: Spring IoC容器从Java标准中学到了什么? 单一类型依赖查找 JNDI - javax.naming.Context#lookup(javax.naming.Name) JavaBeans - java.beans.beancontext.BeanContext 集合类型依赖查找 java.beans.beancontext.BeanContext 集合查找方法 层…

sqli-labs/Less-51

这一关的欢迎界面依然是以sort作为注入点 我们首先来判断一下是否为数字型注入 输入如下 sortrand() 对尝试几次 发现页面并没有发生变化 说明这道题的注入类型属于字符型 然后尝试输入以下内容 sort1 报错了 报错信息如下 我们从报错信息可以知道这道题的注入类型属于单…

期末前端web大作业——HTML+CSS+JavaScript仿京东购物商城网页制作(7页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

#边学边考 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理

答题报告 自我分析 有可能是间隔时间太长&#xff0c;本章节从开始学习到今天&#xff08;11.24&#xff09;学完&#xff0c;中间至少停止了1周以上&#xff0c;造成对基本知识记忆不牢固。对重点知识没有重点记忆&#xff0c;走马观花&#xff0c;以至于混淆。 答题解析 关…

MySQL 进阶 图文详解InnoDB储存引擎

前言 SQL 语句的最终执行者是存储引擎。存储引擎在经解析器、优化器处理后被执行器调用其接口执行优化后的执行计划。MySQL 存储引擎包括 InnoDB、Myisam、Memory、Archive、CSV 存储引擎等&#xff0c;其中最常用也是MySQL 默认的存储引擎是 InnoDB。 写入缓冲池&#xff08;…

用DIV+CSS技术设计的水果介绍网站(web前端网页制作课作业)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

软件测试面试技巧有哪些?可以从这2个方面去进行准备

面试所有只职场人&#xff0c;通往工作岗位的第一道关卡&#xff0c;也是最重要的一道门槛。而面试中&#xff0c;如何回答HR提出的问题很大程度上决定了面试能不能成功。所以这些软件测试的面试技巧你可不能错过了。 首先是自我介绍 自我介绍的时间不能太短&#xff0c;几十秒…

(附源码)计算机毕业设计JavaJava毕设项目财务管理系统的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

【Flutter】shape 属性 ShapeBorder,形状

文章目录前言一、shape 是什么&#xff1f;二、不同的形状1.BeveledRectangleBorder2.Border3.CircleBorder圆形4.ContinuousRectangleBorder连续圆角5.StadiumBorder 体育场边界 &#xff0c;药丸形状6.OutlineInputBorder外边框可以定制圆角7.UnderlineInputBorder下划线总结…

Springboot Security 前后端分离模式自由接口最小工作模型

但凡讲解Springboot Security的教程&#xff0c;都是根据其本身的定义&#xff0c;前后端整合在一起&#xff0c;登录采用form或者basic。我们现在的很多项目&#xff0c;前后端分离&#xff0c;form登录已经不适用了。很多程序的架构要求所有的接口都采用application/json方式…