CMS GC要决定是否在full GC时做压缩,会依赖几个条件。其中, 
第一种条件,UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 是搭配使用的;前者目前默认就是true了,也就是关键在后者上。 
第二种条件是用户调用了System.gc(),而且DisableExplicitGC没有开启。 
第三种条件是young gen报告接下来如果做增量收集会失败;简单来说也就是young gen预计old gen没有足够空间来容纳下次young GC晋升的对象。 
上述三种条件的任意一种成立都会让CMS决定这次做full GC时要做压缩。

CMSFullGCsBeforeCompaction 说的是,在上一次CMS并发GC执行过后,到底还要再执行多少次full GC才会做压缩。默认是0,也就是在默认配置下每次CMS GC顶不住了而要转入full GC的时候都会做压缩。 把CMSFullGCsBeforeCompaction配置为10,就会让上面说的第一个条件变成每隔10次真正的full GC才做一次压缩(而不是每10次CMS并发GC就做一次压缩,目前VM里没有这样的参数)。这会使full GC更少做压缩,也就更容易使CMS的old gen受碎片化问题的困扰。 本来这个参数就是用来配置降低full GC压缩的频率,以期减少某些full GC的暂停时间。CMS回退到full GC时用的算法是mark-sweep-compact,但compaction是可选的,不做的话碎片化会严重些但这次full GC的暂停时间会短些;这是个取舍。

2. -XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnly

这两个设置一般配合使用,一般用于『降低CMS GC频率或者增加频率、减少GC时长』的需求

-XX:CMSInitiatingOccupancyFraction=70 是指设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);

-XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整.

3. -XX:+CMSScavengeBeforeRemark

在CMS GC前启动一次ygc,目的在于减少old gen对ygc gen的引用,降低remark时的开销-----一般CMS的GC耗时 80%都在remark阶段

-XX:+UseCMSInitiatingOccupancyOnly

我们用-XX+UseCMSInitiatingOccupancyOnly标志来命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期。而是,当该标志被开启时,JVM通过CMSInitiatingOccupancyFraction的值进行每一次CMS收集,而不仅仅是第一次。然而,请记住大多数情况下,JVM比我们自己能作出更好的垃圾收集决策。因此,只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。

-XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnly相关推荐

  1. CMS收集器几个参数详解 -XX:CMSInitiatingOccupancyFraction, CMSFullGCsBeforeCompaction

    CMSInitiatingOccupancyFraction -XX:CMSInitiatingOccupancyFraction这个参数是指在使用CMS收集器的情况下,老年代使用了指定阈值的内存时, ...

  2. -XX:CMSInitiatingOccupancyFraction

    使用例子: -XX:CMSInitiatingOccupancyFraction=70 CMS垃圾收集器,当老年代达到70%时,触发CMS垃圾回收. 查看CMSInitiatingOccupancyF ...

  3. -XX:CMSInitiatingOccupancyFraction和-XX:+UseCMSInitiatingOccupancyOnly参数

    -XX:CMSInitiatingOccupancyFraction:在使用CMS收集器的情况下,指定老年代被使用的内存空间的阈值,达到该阈值则触发Full GC. -XX:+UseCMSInitia ...

  4. -XX:CMSInitiatingOccupancyFraction=92 Java8

    Java8中,-XX:CMSInitiatingOccupancyFraction的默认值是92,详情见官网: Starting a Concurrent Collection Cycle With ...

  5. 【Flink】TaskSubmissionException: No task slot allocated for job ID xx and allocation ID xx.

    文章目录 1.概述 1.概述 flink任务提交报错 TaskSubmissionException: No task slot allocated for job ID xx and allocat ...

  6. Java编译报错:无法将类XX中的构造器XX应用到给定类型

    1.idea新版本搜不到lombok插件? 报错如图: 实体类: 编译的时候报错... 下载的最新版本idea,2021.1.1 不对啊,老版本都没问题的 突然想到虽然有lombok的依赖包,但是插件 ...

  7. bash xx.sh与sh xx.sh以及./xx.sh的区别

    在ubuntu中,sh只是bash的一个链接,执行的程序都是一样的,命令解释器是一样的.但bash xx.sh和./xx.sh和sh xx.sh还是有不同的,bash xx.sh和sh xxx.sh都 ...

  8. 题目1 求Sum=x+xx+xxx+xxxx+xxx+xx+x的值,其中x是一个1~9的数字。从键盘上输入任意1~9的数字(如输入此范围外的数据,不处理该数据,程序提醒后继续输入),请输出Sum的结果

    题目1 求Sum=x+xx+xxx+xxxx+xxx+xx+x的值,其中x是一个19的数字.从键盘上输入任意19的数字(如输入此范围外的数据,不处理该数据,程序提醒后继续输入),请输出Sum的结果:程 ...

  9. 第9课:jvm的gc时候核心参数详解:-XX:NewRatio、-XX:SurvivorRatio、-XX:NewSize、-XX:MaxNewSize

    内容: 1.-XX:NewRatio     2.-XX:SurvivorRatio     3.-XX:NewSize和-XX:MaxNewSize 一.JVM内存结构图 二.参数详解 1.-xx: ...

最新文章

  1. C++:运算符重载函数之成员运算符重载函数
  2. 基础才是重中之重~何为原子化操作
  3. 医宗金鉴自学指南_自学《医宗金鉴》能学会中医吗?
  4. python OrderedDict 详解
  5. iptables 开启3306端口
  6. NAPI 技术在 Linux 网络驱动上的应用和完善
  7. 网络嵌入之STNE model
  8. paip.SOCKET抓包工具总结
  9. 卫星遥感数据处理软件SeaDAS
  10. 【整理】详解嵌入式片上资源之SDRAM内存
  11. MongoDB修改器使用
  12. #35-【刷题】乐乐的方块
  13. 【Lilishop商城】No4-2.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-平台注册会员接口开发
  14. App Inventor 2 题库设计制作流程
  15. 苹果xr十大隐藏功能_网上找的一些非常实用的苹果笔记本使用技巧及隐藏功能,收藏了...
  16. 热力学第二定律的局限性与对热寂说的反驳
  17. 数据备份有哪些种类?
  18. Explore EPF021D ADC微控制器
  19. Carsim-Simulink键盘实现控制Carsim车辆转向-1
  20. 【震惊】富士康再次发生员工跳楼身亡 系半年来第12例

热门文章

  1. html代码消失一半,div css最后一排文字字体显示一半显示不全
  2. 【C++】什么是RAII?
  3. 计算机二级准考证解压缩失败 文件损坏 怎么办 ? 急
  4. Log4j日志的级别与使用
  5. CSUST第六次周赛题解
  6. 中国芯片开创了ARM架构服务器芯片市场,高通如今希望跟着喝汤
  7. 力科的示波器离线波形查看工具
  8. 控制系统中的AI、AO、DI、DO是什么意思——控制系统基础知识
  9. 从零实现深度学习框架——从共现矩阵到点互信息
  10. 【计算机毕业设计】基于WEB的婴幼儿用品商城系统