JVM 对象动态年龄判断是怎么回事?

虚拟机并不是永远地要求对象年龄必须达到了-XX:MaxTenuringThreshold=15才能晋升老年代;

动态年龄判断: Survivor区的对象年龄从小到大进行累加,当累加到X年龄(某个年龄)时占用空间的总和大于50%(可以使用-XX:TargetSurvivorRatio=?来设置保留多少空闲空间,默认值是50),那么比X年龄大的对象都会晋升到老年代;

《深入理解Java虚拟机》中有如上的一段描述,讲的是动态对象年龄判定,避免-XX:MaxTenuringThreshold 设置过大导致大量对象无法晋升。但是存在一个问题,如果说非得相同年龄所有对象大小总和大于Survivor空间的一半才能晋升,按照如下场景:

  1. MaxTenuringThreshold为15
  2. 年龄1的对象占用了33%
  3. 年龄2的对象占用33%
  4. 年龄3的对象占用34%。

得出推论:

  1. 按照晋升的标准。首先年龄不满足MaxTenuringThreshold,不会晋升。
  2. 每个年龄的对象都不满足50%,不会晋升。

Survivor都占用了100%了,但是对象就不晋升。导致老年代明明有空间,但是对象就停留在年轻代。但这个结论似乎与jvm的表现不符合,只要老年代有空间,最后还会晋升的。

把晋升年龄计算的代码摘出,我们来看看动态年龄的计算:

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;...
}

代码中有一个TargetSurvivorRatio的值。

-XX:TargetSurvivorRatio (目标存活率,默认为50%)
根据代码可以看到,动态年龄计算方式为:

  1. 通过这个比率来计算一个期望值,desired_survivor_size 。
  2. 然后用一个total计数器,累加每个年龄段对象大小的总和。
  3. 当total大于desired_survivor_size 停止。
  4. 然后用当前age和MaxTenuringThreshold 对比找出最小值作为结果。

总体表征就是,年龄从小到大进行累加,当加入某个年龄段后,累加和超过survivor区域*TargetSurvivorRatio的时候,就从这个年龄段网上的年龄的对象进行晋升。

所以上面的场景,年龄1的占用了33%,年龄2的占用了33%,累加和超过默认的TargetSurvivorRatio(50%),年龄2和年龄3的对象都要晋升。
动态对象年龄判断,主要是被TargetSurvivorRatio这个参数来控制。而且算的是年龄从小到大的累加和,而不是某个年龄段对象的大小。

JVM 对象动态年龄判断相关推荐

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

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

  2. JVM 动态年龄判断规则

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

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

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

  4. 动态年龄判断何时触发?

    新生代GC过后,要转移存活对象进入s0或s1之前,会判断s0或s1中存活的对象所占比例是否大于默认的50%,规则是从最小的年龄加起,直到加到某个年龄时,内存占比超过了50%,那么所有年龄大于等于这个年 ...

  5. JVM对象创建与内存分配机制学习总结

    对象的创建过程 1.类加载检查 虚拟机遇到一条new指令时(new关键词.对象克隆.对象序列化等),首先会检查这个类是否已被加载.解析和初始化过.如果没有,要先执行相应的类加载过程. 2.分配内存 内 ...

  6. 32g内存 java开发,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧...

    内存分配机制 逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被 ...

  7. JVM——对象创建与内存分配机制

    文章目录 1.对象的创建 1.1.类加载检查 1.2.分配内存 1.3.初始化 1.4.设置对象头 1.5.执行方法 2.对象内存分配 2.1. 对象栈上分配 2.2.对象在Eden区分配 2.3.大 ...

  8. jvm动态年龄计算规则以及为什么要这样做

    一.计算规则 有一个关键参数TargetSurvivorRatio.这个参数是年轻代对象动态晋升老年代的关键参数.下面是虚拟机中晋升老年代计算的代码. uint ageTable::compute_t ...

  9. JVM-动态年龄判断你真的理解了吗

    哈喽哈喽大家猴,我是把代码写成bug的大头菜.公众号:大头菜技术(bigheadit).原创不易,但欢迎转载. 看文章前,我们先复习一下. 什么对象才能直接进入老年代? 你可能很快就说出来,毕竟八股文 ...

最新文章

  1. 单片机c语言实现表格数据调用,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  2. An Edge-Guided Image Interpolation Algorithm via Directional Filtering and Data Fusion【翻译】
  3. Python调用MySQL模块初试
  4. Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)
  5. 字节跳动 ClickHouse 在 A/B 实验和模型训练的使用
  6. 多种数据形式下智能问答的应用解读
  7. BZOJ 1012: [JSOI2008]最大数maxnumber
  8. 令人激动!谷歌推强化学习新框架「多巴胺」,基于TensorFlow,已开源丨附github...
  9. 实现四台服务器的负载均衡
  10. 蓝桥杯 大整数乘法 试题 算法训练 P0805
  11. MATLAB 中跳出if条件判断
  12. crystal xcelsius 的使用
  13. 解决Navicat远程服务器2013-Lost connection to MYSQL server at 'waitting for initial communication packet'
  14. mysql 作为服务启动_mysql系列-安装及服务启动
  15. Java工具使用(导读)
  16. 一种典型的手机APP远程控制PLC解决方案
  17. 长短视频平台内卷自制剧,网剧制作商耐看娱乐能“耐看”吗?
  18. Windows一键删除指定文件或文件夹
  19. JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法
  20. 数据处理中常用的Excel基本操作及函数

热门文章

  1. oracle 判断数字是否为整数,怎么判断JS中一个数字是否为整数?
  2. “ To B ” = “2B” ?!
  3. Unity3D学习之(自动寻径)
  4. 百度地图-鹰眼轨迹服务
  5. 使用 TiDB Dashboard 诊断报告定位问题
  6. 零基础入门语音识别-食物声音识别[Task 3]
  7. 分布式系统唯一ID生成方案浅析
  8. 路径偏移定位不准确?华为定位SuperGNSS技术帮您解决这一难题!
  9. 用opencv给彦女王生成一副蒙太奇画像
  10. show**介绍**