一、计算规则

有一个关键参数TargetSurvivorRatio。这个参数是年轻代对象动态晋升老年代的关键参数。下面是虚拟机中晋升老年代计算的代码。

uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {//survivor_capacity是survivor空间的大小size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);size_t total = 0;uint age = 1;while (age < table_size) {total += sizes[age];//sizes数组是每个年龄段对象大小if (total > desired_survivor_size) break;age++;}uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;...
}

翻译上面的代码就是:

1、通过survivor区内存值的大小和这个关键比率来计算一个期望值,desired_survivor_size 。

2、定义一个total计数器,累加每个年龄段对象大小的总和。

3、当total大于期望值desired_survivor_size 时停止累加。

4、比较当前age和MaxTenuringThreshold 哪个更小,将其作为下一次晋升老年代的基准值

我们可以通过-XX:TargetSurvivorRatio这个参数来制定这个比率,但是议案不会调整他。

大致逻辑就是,遍历对象的时候,从年龄由小到大进行累加,当加到某个年龄之后,发现内存总和大于了那个上面计算的那个期望值,就从这个年龄段开始把以上的对象都放在老年代中

二、为什么这样做?

但是我们应该能想到,不是有个-XX:MaxTenuringThreshold这个参数来指定最大对象吗,这里为什么还要做一个动态的判断呢?

JVM引入动态年龄计算,主要基于如下两点考虑:

1、如果没有动态计算,固定按照MaxTenuringThreshold设定的阈值作为晋升条件:

a)MaxTenuringThreshold设置的过大,原本应该晋升的对象一直停留在Survivor区,直到Survivor区大小不足以满足完成一次minorGC时,jvm会将Eden+Svuvivor中存活的一股脑全部移动到老年代,不管对象的年龄是多少。这样对象老化的机制就失效了。

b)MaxTenuringThreshold设置的过小,那么对象就会更早的被移动到老年代,对象不能在新生代充分被回收,大量短期对象被晋升到老年代,老年代空间迅速增长,引起频繁的Major GC。分代回收失去了意义,严重影响GC性能。

2、应用程序在不同时间节点上的请求量与并发量都不同:特殊任务的执行或者流量成分的变化,都会导致对象的生命周期分布发生波动,那么固定的阈值设定,因为无法动态适应变化,会造成和上面相同的问题。

总结来说,为了更好的适应不同程序的内存情况,虚拟机并不总是要求对象年龄必须达到Maxtenuringthreshhold再晋级老年代。而是通过这种方式来实现老年代的晋升。

jvm动态年龄计算规则以及为什么要这样做相关推荐

  1. JVM 动态年龄判断规则

    JVM 动态年龄判断规则 对象进入老年代的动态年龄判断规则(动态晋升年龄计算阈值):Minor GC 时,Survivor 中年龄 1 到 N 的对象大小超过 Survivor 的 50% 时,则将大 ...

  2. JVM 对象动态年龄判断

    JVM 对象动态年龄判断是怎么回事? 虚拟机并不是永远地要求对象年龄必须达到了-XX:MaxTenuringThreshold=15才能晋升老年代: 动态年龄判断: Survivor区的对象年龄从小到 ...

  3. jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景

    文章目录 Pre 动态年龄判定规则 动态年龄判定规则的部分示例代码 部分示例代码运行后产生的gc日志 完善示例代码 GC日志分析 Pre 上一篇文章我们已经带着大家初步分析了一次Young GC的日志 ...

  4. JVM 晋升到老年代的动态年龄判断

    先说结论,方便复习: 新的动态年龄判断算法:Survivor区的对象年龄从小到大进行累加,当累加到 X 年龄时的总和大于50%(可以使用-XX:TargetSurvivorRatio=? 来设置保留多 ...

  5. jvm动态对象年龄判定

    背景 jvm动态对象年龄判定,是根据Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenurin ...

  6. python国防_Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算...

    一.基本框架 项目任务: 每个人的体能测试有单杠.仰卧起坐.30米x2蛇形跑.3000米跑四个项目,外加体型是否合格(BMI身体质量指数或者PBF体脂百分比),每项原始测试数据,通过不同项目各自规定的 ...

  7. SpringBoot整合Drools规则引擎动态生成业务规则

    最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...

  8. 互联网晚报 | 07月02日 星期六 | ​​​北京健康宝核酸检测天数计算规则调整;​上海鼓励用人单位吸纳失业3个月及以上人员...

    北京健康宝核酸检测天数计算规则调整 近日,北京健康宝发布新版,结合北京市最新防疫政策及用户反馈,对扫码结果展示.到访人登记簿.疫苗接种状态等功能进行优化升级.调整后,健康宝核酸检测天数严格按照日历日计 ...

  9. python中and怎么计算_Python中 and,or 的计算规则

    一.纯 and 和 or 语句 1. 在纯and语句中,如果每一个表达式都不是假的话,那么返回最后一个,因为需要一直匹配直到最后一个.如果有一个是假,那么返回假 2. 在纯or语句中,只要有一个表达式 ...

最新文章

  1. Centos7 下 配置 rsync 以及 rsync+inotify 实时同步
  2. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组缺口箱图(notch boxplot)实战
  3. [国家集训队]happiness 最小割 BZOJ 2127
  4. centos6.2系统使用扩展源epel报错问题解决方法
  5. asp.net甘特图控件exG2antt介绍及免费下载
  6. eclipselink_Java EE 7的高峰– EclipseLink的多租户示例
  7. linux系统账户口令管理
  8. sql注入攻击_让你彻底明白sql注入攻击
  9. Java操作Mongodb 保存/读取java对象到/从mongodb
  10. 微信小程序--搜索关键词高亮
  11. 【Java并发编程】—–“J.U.C”:ArrayBlockingQueue
  12. 在CMD上运行使用java命令运行java文件时出现错误:找不到或者无法加载主类的问题 解决办法
  13. 国外LEAD赚钱教程:EMU篇(五)国外lead常用工具汇总
  14. html自动跳转到另外页面,html从一个页面跳转至另一个html页面的子页面
  15. [SDOI2016]征途
  16. 进制转换: 十进制转换成其他进制(一)
  17. PC浏览器模拟手机浏览器访问网站
  18. PyG教程(2):图数据
  19. 2016上半年高项项目经理考试培训考试感想
  20. 【C语言学习】C语言入门

热门文章

  1. 内存颗粒版本判断方法和编号解析(三星、美光、海力士)
  2. 移动端touch事件和click事件的区别
  3. 解决localhost打不开的情况
  4. 专业的个人记帐软件 爱上记帐 1.0.1
  5. 10岁男童高考566分8岁开发操作系统
  6. torch.cat()的类型转换
  7. pyspark mysql rdd_PySpark之RDD操作
  8. 粤嵌星计划打卡第95天(javaweb js 标签)
  9. 手机UC浏览器字体放大
  10. 这个春节,小灰收到一件不寻常的礼物