JVM 动态年龄判断规则

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

《深入理解 Java 虚拟机》书中对动态年龄判断规则的解释大致是:同龄对象大小超过 50% 时,则将大于等于该年龄的对象放入老年代。

以前看到这块的时候一直觉得有点不太理解,因为如果是同龄对象的话,那么这批放入老年代的对象就必然是 1 岁,因为如果在 1 岁的时候没有达到 50%,那么在之后就更不可能达到 50% 了。但也没太在意,直到最近又开始学习 JVM 相关知识,才发现了不一样的解释,囧。

验证:

public class TestTargetSurvivorRatio {private static final int MB = 1024 * 1024;public static void main(String[] args) throws InterruptedException {byte[] b1 = new byte[MB * 33];byte[] b2 = new byte[MB * 33];byte[] a1 = new byte[MB * 3];b1 = null;b2 = null;System.out.println("--------1 start");b1 = new byte[MB * 33];// 垃圾回收完成后:// 大概1M的系统垃圾+3M的a1进入Survivor,垃圾回收完成后,这些对象就是年龄1System.out.println("--------1 end");b2 = new byte[MB * 33];byte[] a2 = new byte[MB * 3];b1 = null;b2 = null;System.out.println("--------2 start");// 垃圾回收前,Survivor中的对象年龄1到N的大小不足50%// 因此在回收的时候年龄1的对象不会进入老年代b1 = new byte[MB * 33];// 垃圾回收完成后:// Survivor中原有的大概1M的系统垃圾+3M的a1变成年龄2// 新进入Survivor的3M的a2就是年龄1System.out.println("--------2 end");b2 = new byte[MB * 33];byte[] a3 = new byte[MB * 3];b1 = null;b2 = null;System.out.println("--------3 start");// 垃圾回收前,年龄2有大概4M,年龄1大概有3M,超过Survivor的50%// 因此在回收的时候年龄2的4M会进入老年代b1 = new byte[MB * 33];// 垃圾回收完成后:// Survivor中3M的a2年龄变成2// 新进入的3M的a3为年龄1// 老年代中的则是原先的系统大概1M和3M的a1System.out.println("--------3 end");}
}

设置以下 JVM 参数,运行上述代码

-Xmx200M
-Xms200M
-Xmn100M
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=15
-XX:PretenureSizeThreshold=100M
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps

最终运行结果:( jdk 8)

--------1 start
0.192: [GC (Allocation Failure) 0.192: [ParNew: 77214K->4000K(92160K), 0.0028037 secs] 77214K->4000K(194560K), 0.0029006 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
--------1 end
--------2 start
0.208: [GC (Allocation Failure) 0.208: [ParNew: 76242K->7255K(92160K), 0.0044250 secs] 76242K->7255K(194560K), 0.0044863 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
--------2 end
--------3 start
0.225: [GC (Allocation Failure) 0.225: [ParNew: 81144K->6339K(92160K), 0.0044202 secs] 81144K->10187K(194560K), 0.0044672 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
--------3 end
Heappar new generation   total 92160K, used 42536K [0x00000000f3800000, 0x00000000f9c00000, 0x00000000f9c00000)eden space 81920K,  44% used [0x00000000f3800000, 0x00000000f5b59160, 0x00000000f8800000)from space 10240K,  61% used [0x00000000f9200000, 0x00000000f9830f80, 0x00000000f9c00000)to   space 10240K,   0% used [0x00000000f8800000, 0x00000000f8800000, 0x00000000f9200000)concurrent mark-sweep generation total 102400K, used 3847K [0x00000000f9c00000, 0x0000000100000000, 0x0000000100000000)Metaspace       used 3330K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 359K, capacity 388K, committed 512K, reserved 1048576K

JVM 动态年龄判断规则相关推荐

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

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

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

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

  3. JVM 对象动态年龄判断

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

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

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

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

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

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

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

  7. jvm动态对象年龄判定

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

  8. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  9. contentwindow无法搜索对象_面试官:讲一下Jvm中如何判断对象的生死?

    但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问,在 JVM 中如何判断一个对象的生死状态? 判断对象的生死状态的算法有以下几个: 1.引用计数器算法 引用计算器判断对象是否存活的算 ...

最新文章

  1. VMware虚拟设备之虚拟磁盘配置与虚拟磁盘置备类型相关介绍
  2. UNIX中的文件和目录
  3. php 文档在线查看器,Office Web Viewer 在线Office文档查看器API
  4. UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
  5. boost::hana::detail::fast_and用法的测试程序
  6. Apache HttpClient库的日志级别设置原理
  7. Jerry和您聊聊Chrome开发者工具
  8. 一种同于计算机键盘的测试装置,一种计算机键盘按键测试装置
  9. ArcEngine中使用上下左右键移动地图
  10. avatar.php uid,phpcms函数库中获取会员头像方法get_memberavatar()有时无效问题
  11. toast弹窗_一个弹窗的设计思考
  12. C# 学生简单管理系统 数据库 1.0版本
  13. 圆形Camera预览实现
  14. cad2004教程_AutoCAD视频教程!0基础到大神,室内建筑机械电气家具土木工程园林景观,七大行业方向助你成为精英!...
  15. 天气预报:强势力的“.fans+体育”旋风正席卷全球!
  16. es7新特性随堂笔记
  17. Science| 深度解析肠道菌群与肥胖
  18. 携手共进 智享未来丨美格智能2023年代理商合作伙伴大会成功举办
  19. IEduChina2019国际教育展在北京完美落幕
  20. 三级管的饱和区和MOS管的饱和区

热门文章

  1. 不同品牌android手机ui,体验最流畅的两大国产品牌手机UI?EMUI和Flyme
  2. 分享10 个超酷的 HTML5/CSS3 应用及源码
  3. structural induction
  4. 字符串转数字,数字转字符串
  5. Lattice SII9136CTU-3 HDMI1.4 视频音频接口芯片
  6. T703软件测试简历,OPPO Finder x907 系统应用及性能测试
  7. centos 挂载 onedirve
  8. 虹科案例 | 丝芙兰xDomo:全球美妆巨头商业智能新玩法
  9. FITC-Dextran 荧光素异硫氰酸酯-葡聚糖,FITC-葡聚糖
  10. AI绘画软件数画上线真人元宇宙ai虚拟头像,制作教程来了