JVM CMS垃圾收集器相关一个重要参数CMSInitiatingOccupancyFraction,默认值具体是多少,众说纷纭,这里分析和验证一下。

-XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC,百分比格式。

1. 计算CMSInitiatingOccupancyFraction

具体还是要看openJDK的代码(基于JDK8):

// hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp// The field "_initiating_occupancy" represents the occupancy percentage
// at which we trigger a new collection cycle.  Unless explicitly specified
// via CMSInitiatingOccupancyFraction (argument "io" below), it
// is calculated by:
//
//   Let "f" be MinHeapFreeRatio in
//
//    _intiating_occupancy = 100-f +
//                           f * (CMSTriggerRatio/100)
//   where CMSTriggerRatio is the argument "tr" below.
//
// That is, if we assume the heap is at its desired maximum occupancy at the
// end of a collection, we let CMSTriggerRatio of the (purported) free
// space be allocated before initiating a new collection cycle.
//
void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, uintx tr) {assert(io <= 100 && tr <= 100, "Check the arguments");if (io >= 0) {_initiating_occupancy = (double)io / 100.0;} else {_initiating_occupancy = ((100 - MinHeapFreeRatio) +(double)(tr * MinHeapFreeRatio) / 100.0)/ 100.0;}
}

其中:
io参数是:输入的CMSInitiatingOccupancyFraction
tr参数是:CMSTriggerRatio的值,JDK8默认是80

代码逻辑比较简单:

  • 若指定的CMSInitiatingOccupancyFraction为正值,例如80,则老年代到达80%就会触发FullGC。
  • CMSInitiatingOccupancyFraction默认为-1,走下面的分支。
    基于JDK8,结合其余2个参数MinHeapFreeRatio默认值40、CMSTriggerRatio默认值80,计算出的默认百分比是92
    MinHeapFreeRatio默认值0、CMSTriggerRatio默认值80,则计算出的默认百分比是100

2. MinHeapFreeRatio的默认值到底是多少?0还是40?

这里有个疑问点:MinHeapFreeRatio的默认值到底是多少?0还是40?

通过-XX:+PrintFlagsFinal参数打印出来的MinHeapFreeRatio默认值是0

uintx MinHeapFreeRatio                          = 0                                   {manageable}

再借助jinfo -flag MinHeapFreeRatio PID打印出来的MinHeapFreeRatio默认值都是0

C:\Users\root>jinfo -flag MinHeapFreeRatio 18896
-XX:MinHeapFreeRatio=0

但是从源码上看MinHeapFreeRatio默认值从JDK6开始默认值就一直是40了。

// hotspot/src/share/vm/runtime/globals.hpp
manageable(uintx, MinHeapFreeRatio, 40,                                   \"The minimum percentage of heap free after GC to avoid expansion."\" For most GCs this applies to the old generation. In G1 and"     \" ParallelGC it applies to the whole heap.")                      \\
manageable(uintx, MaxHeapFreeRatio, 70,                                   \"The maximum percentage of heap free after GC to avoid shrinking."\" For most GCs this applies to the old generation. In G1 and"     \" ParallelGC it applies to the whole heap.")


说明MinHeapFreeRatio在哪里进行修改了!

查了一下openJDK相关的代码,发现有这个UseAdaptiveSizePolicy配置,打开时,会默认将MinHeapFreeRatio设置为0MaxHeapFreeRatio设置为100
UseAdaptiveSizePolicy默认就是开启的!这也就能解释为什么代码中默认值是40,而实际运行PrintFlagsFinal时则是0。

bool UseAdaptiveSizePolicy                     = true                                {product}
// hotspot/src/share/vm/runtime/arguments.cpp
if (UseAdaptiveSizePolicy) {// We don't want to limit adaptive heap sizing's freedom to adjust the heap// unless the user actually sets these flags.if (FLAG_IS_DEFAULT(MinHeapFreeRatio)) {FLAG_SET_DEFAULT(MinHeapFreeRatio, 0);_min_heap_free_ratio = MinHeapFreeRatio;}if (FLAG_IS_DEFAULT(MaxHeapFreeRatio)) {FLAG_SET_DEFAULT(MaxHeapFreeRatio, 100);_max_heap_free_ratio = MaxHeapFreeRatio;}
}

关闭UseAdaptiveSizePolicy,然后再查看MinHeapFreeRatio

java -XX:+PrintFlagsFinal -XX:-UseAdaptiveSizePolicy -version | grep MinHeapFreeRatio

结果符合预期了:

uintx MinHeapFreeRatio                          = 40                                  {manageable}

3. UseAdaptiveSizePolicy和CMS

从网上查阅到的信息是,对于JDK8,当启用CMS时,无论UseAdaptiveSizePolicy设置成什么值,都会关闭UseAdaptiveSizePolicy,自然而然MinHeapFreeRatio就不会被调整为0了。

java -XX:+PrintFlagsFinal -XX:+UseConcMarkSweepGC -version | grep -E "MinHeapFreeRatio | UseAdaptiveSizePolicy"
java -XX:+PrintFlagsFinal -XX:+UseConcMarkSweepGC -XX:+UseAdaptiveSizePolicy -version | grep -E "MinHeapFreeRatio | UseAdaptiveSizePolicy"

结果符合预期:UseAdaptiveSizePolicy关闭,且MinHeapFreeRatio变为默认值40

uintx MinHeapFreeRatio                          = 40                                  {manageable}bool UseAdaptiveSizePolicy                     = false                               {product}
Java HotSpot(TM) 64-Bit Server VM warning: disabling UseAdaptiveSizePolicy; it is incompatible with UseConcMarkSweepGC.
uintx MinHeapFreeRatio                          = 40                                  {manageable}bool UseAdaptiveSizePolicy                    := false                               {product}

4. 结论

对于JDK6/JDK7/JDK8,CMS的参数:CMSInitiatingOccupancyFraction,肯定需要启用CMS(-XX:+UseConcMarkSweepGC),此时UseAdaptiveSizePolicy会强制关闭,所以MinHeapFreeRatio的默认值就是40CMSInitiatingOccupancyFraction默认值就是92,百分比类型。不存在100%这样的情况。

CMSInitiatingOccupancyFraction计算释疑相关推荐

  1. CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 背景 测试CMSInitiatingOccupancyFracti ...

  2. 电磁波传播相位是否会变化_电磁波相位关系释疑

    本文写出来是得到韦显交的启发,原贴于旧版博客空间,现在移到这里,这里方便修改.原来用了法拉第-麦克斯韦方程积分形式,现在改用其简化表述,便于阅读. 图1: 某一时刻线极化平面电磁波的磁场和电场,图片来 ...

  3. 计算机网络 计算路由表

    想找几道带答案的路由表计算题真难- 东翻西翻找到几题 https://wenku.baidu.com/view/65e0e12b2f60ddccda38a0bf.html 几个例子 <计算机网络 ...

  4. 第七次全国人口普查登记今日零时启动 六大释疑都在这

    新京报讯 我国第七次全国人口普查登记今日零时正式启动,持续至12月10日,随后开展普查数据处理.汇总等工作,2021年对外发布主要数据公报.本次普查,普查对象首次可选择自主填报,也可以由普查员上门登记 ...

  5. [转载]scanf()函数释疑[作者]------knocker

    一.             序言 scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian W.Kerninghan & Denni ...

  6. 六分九用计算机怎么计算出来,计算器

    计算器 计算器的认识和简单应用 设计者:德胜小学   李一青 教学内容:义务教育六年制小学第九册第二单元第42页. 教学目标 : 1.通过学生自主探究,掌握计算器的使用方法,并能够用计算器进行简单的计 ...

  7. 安大计算机网络,浅谈计算机网络环境下的网络教学 安徽大学计算机教学部网络教学平台...

    [摘要] 网络的发展,创造出全新的网络文化.不少学校顺应时代需要建设了校园网,并连入了互联网,开始了网络教学的尝试.教师在教学过程中如何根据网络教学不同的教学模式,发挥教师的主导作用和激发学生自主学习 ...

  8. JVM -XX:CMSInitiatingOccupancyFraction=90 这个参数是有取值范围的

    CMSInitiatingOccupancyFraction值与Xmn的关系公式 promontion faild产生的原因是EDEN空间不足的情况下将EDEN与From survivor中的存活对象 ...

  9. 大数据分析平台释疑专用帖第二弹

    不管是想要快速了解BI大数据分析平台,还是想要了解BI和自己的需求匹配度,都可关注我们的释疑专用贴. 1.可以分析直播数据吗? 严格来说,只要能够提供数据,就可以做数据可视化分析,直播数据也同理. 如 ...

  10. RSA签名算法,计算调用加密报文,安全传输

    RSA签名算法 1. 获取当前的时间戳参数 2. 计算参数签名 3. 获取请求对象的MD5密文 4. 通过私钥计算某个参数的RSA签名 5. 转换字符集到utf8 6. MD5加密字符串 7. bas ...

最新文章

  1. 文件目录管理及vi编辑器的使用
  2. 开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端
  3. 编写css让一个已知宽高的div元素水平居中?垂直居中
  4. 计算机投诉信英语作文,投诉信A Letter of Complaint
  5. CMU科学家们带一群机器人开房,并收集了28,000种不同的姿势
  6. Oracle收购Talari,第一家SD-WAN公有云提供商出现
  7. 背包九讲Java版本
  8. kali mysql 卸载,linux mysql卸载命令
  9. win10电脑右键视频或者图片文件卡死
  10. 机器学习 交叉验证与网格搜索调参
  11. 分享若何利用博客做外链的心得寻味
  12. 微观经济学之供给与需求--第一章第二章
  13. Java字节码编程之非常好用的javassist
  14. 微信小程序-枯木学习笔记5-我的信息
  15. 三菱编程软件GX Works2
  16. HDLBITS笔记五加法器减法器
  17. matlab ifft函数实例,【 MATLAB 】信号处理工具箱之 ifft 简介及案例分析
  18. 使用IntelliJ IDEA搭建kafka源码环境时遇到Output path错误解决办法
  19. 编写ATL工程实现ActiveX控件调用cryptoAPI接口(二)------------信封加密与解密
  20. php中进制转换,php的进制转换

热门文章

  1. 环洋市场调研-2021年全球Camlock联轴器行业调研及趋势分析报告
  2. 老师给我推荐的经典管理书籍
  3. IT服务管理流程控制主要绩效指标有哪些?
  4. 大数据——海量数据处理的基本方法总结
  5. 不能创建对象qmdispatch_activex部件不能创建对象怎么解决
  6. 新版闪讯破解无线wifi共享
  7. 91手机助手官网iPhone版 v5.6.1 官方版
  8. 追光者百度网盘提取码查询工具 v2.0726附使用方法
  9. 静默安装oracle11,Oracle11g静默安装
  10. python 找色点击_Python实现按键精灵(二)-找图找色