JVM 动态年龄判断规则
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 动态年龄判断规则相关推荐
- jvm动态年龄计算规则以及为什么要这样做
一.计算规则 有一个关键参数TargetSurvivorRatio.这个参数是年轻代对象动态晋升老年代的关键参数.下面是虚拟机中晋升老年代计算的代码. uint ageTable::compute_t ...
- JVM 晋升到老年代的动态年龄判断
先说结论,方便复习: 新的动态年龄判断算法:Survivor区的对象年龄从小到大进行累加,当累加到 X 年龄时的总和大于50%(可以使用-XX:TargetSurvivorRatio=? 来设置保留多 ...
- JVM 对象动态年龄判断
JVM 对象动态年龄判断是怎么回事? 虚拟机并不是永远地要求对象年龄必须达到了-XX:MaxTenuringThreshold=15才能晋升老年代: 动态年龄判断: Survivor区的对象年龄从小到 ...
- jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
文章目录 Pre 动态年龄判定规则 动态年龄判定规则的部分示例代码 部分示例代码运行后产生的gc日志 完善示例代码 GC日志分析 Pre 上一篇文章我们已经带着大家初步分析了一次Young GC的日志 ...
- 动态年龄判断何时触发?
新生代GC过后,要转移存活对象进入s0或s1之前,会判断s0或s1中存活的对象所占比例是否大于默认的50%,规则是从最小的年龄加起,直到加到某个年龄时,内存占比超过了50%,那么所有年龄大于等于这个年 ...
- JVM-动态年龄判断你真的理解了吗
哈喽哈喽大家猴,我是把代码写成bug的大头菜.公众号:大头菜技术(bigheadit).原创不易,但欢迎转载. 看文章前,我们先复习一下. 什么对象才能直接进入老年代? 你可能很快就说出来,毕竟八股文 ...
- jvm动态对象年龄判定
背景 jvm动态对象年龄判定,是根据Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenurin ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- contentwindow无法搜索对象_面试官:讲一下Jvm中如何判断对象的生死?
但凡问到 JVM(Java 虚拟机)通常有 99% 的概率一定会问,在 JVM 中如何判断一个对象的生死状态? 判断对象的生死状态的算法有以下几个: 1.引用计数器算法 引用计算器判断对象是否存活的算 ...
最新文章
- VMware虚拟设备之虚拟磁盘配置与虚拟磁盘置备类型相关介绍
- UNIX中的文件和目录
- php 文档在线查看器,Office Web Viewer 在线Office文档查看器API
- UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
- boost::hana::detail::fast_and用法的测试程序
- Apache HttpClient库的日志级别设置原理
- Jerry和您聊聊Chrome开发者工具
- 一种同于计算机键盘的测试装置,一种计算机键盘按键测试装置
- ArcEngine中使用上下左右键移动地图
- avatar.php uid,phpcms函数库中获取会员头像方法get_memberavatar()有时无效问题
- toast弹窗_一个弹窗的设计思考
- C# 学生简单管理系统 数据库 1.0版本
- 圆形Camera预览实现
- cad2004教程_AutoCAD视频教程!0基础到大神,室内建筑机械电气家具土木工程园林景观,七大行业方向助你成为精英!...
- 天气预报:强势力的“.fans+体育”旋风正席卷全球!
- es7新特性随堂笔记
- Science| 深度解析肠道菌群与肥胖
- 携手共进 智享未来丨美格智能2023年代理商合作伙伴大会成功举办
- IEduChina2019国际教育展在北京完美落幕
- 三级管的饱和区和MOS管的饱和区
热门文章
- 不同品牌android手机ui,体验最流畅的两大国产品牌手机UI?EMUI和Flyme
- 分享10 个超酷的 HTML5/CSS3 应用及源码
- structural induction
- 字符串转数字,数字转字符串
- Lattice SII9136CTU-3 HDMI1.4 视频音频接口芯片
- T703软件测试简历,OPPO Finder x907 系统应用及性能测试
- centos 挂载 onedirve
- 虹科案例 | 丝芙兰xDomo:全球美妆巨头商业智能新玩法
- FITC-Dextran 荧光素异硫氰酸酯-葡聚糖,FITC-葡聚糖
- AI绘画软件数画上线真人元宇宙ai虚拟头像,制作教程来了