哈喽哈喽大家猴,我是把代码写成bug的大头菜。公众号:大头菜技术(bigheadit)。原创不易,但欢迎转载。

看文章前,我们先复习一下。

什么对象才能直接进入老年代?

你可能很快就说出来,毕竟八股文不是白背的。

  • 大对象直接进入老年代。
  • 动态年龄判断
  • 年龄大于阈值,进入老年代
  • Minor GC后,存活的对象空间大于survivor空间,直接进入老年代。

好了嘛,应该没了吧。

这次,我们把目光聚焦到:动态年龄判断。

下面这图片,摘自JVM书的一段话:

什么时候对象能进入老年代空间时?

其中一个触发条件就是:动态年龄判断。

简单点说:在survivor中,相同年龄的所有对象大小大于survivor的一般空间。年龄大于或等于该年龄的对象可以进入老年代。

但真的是这样子吗?

前提条件:现在我假设survivor空间有100M空间。

来。我举个例子哈,跟着我的思路走一遍。

假设年龄3的对象大小超过了survivor区域的一半,比如占据60M吧。

我们分析一下:年龄为3,说明经历了3次GC都存活了下来。

然后我们思考一下,年龄3的对象是从哪里来的?

肯定是从年龄2的对象中来的。这点毋庸置疑吧!

我们再换个思路想一下。

既然,年龄3的对象是从年龄2的对象中来的。(先说明哈:年龄,只增不减)

现在年龄3的对象都已经超过survivor区域的一半了。

那是不是可以说明:年龄2的对象也肯定超过survivor区域的一半。

同理可得:年龄2的对象是从年龄1的对象中来的,那么年龄1的对象也肯定超过一半,是吧。这毋庸置疑吧!

我们来复习一下:

在survivor中,相同年龄的所有对象大小大于survivor的一般空间。年龄大于或等于该年龄的对象可以进入老年代。

你看,如果真的是如上面所说的规则。超过一半空间,该年龄或大于该年龄的对象,都进入老年代。

那还有年龄3的对象什么事呢?

因为年龄3的对象,是从年龄2对象来的,而年龄2对象是从年龄1中的对象来的。

进入老年代的应该在年龄1的对象。压根不会不发展到年龄3的对象。

但真的是这样子吗?

肯定不是,让超过survivor区域一般的年龄1的对象直接进入老年代。JVM的设计者疯了吗?

还是书本的描述有错呢?

真实情况是这样子的:

年龄1+年龄2+年龄3+年龄N的对象加起来的空间,大于survivor区域的一半,就会让年龄N和年龄N以上的对象进入老年代。动态年龄判断应该是这样子的。说的通俗一点:就是年龄从小到大对象的占据空间的累加和,而不是某一个特定年龄对象占据的空间。

有没有被书本骗了的感觉。。。。

好嘛,如果你还不信。

Talk is cheap,Show me the money

搞错了,重来

Talk is cheap ,Show me the code。

uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {//survivor_capacity是survivor空间的大小//desired_survivor_size就是动态年龄判断是否对象进入老年代的阈值//TargetSurvivorRatio:默认50size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);size_t total = 0;uint age = 1;while (age < table_size) {//sizes数组是每个年龄段对象大小//total就是年龄从小到大的对象占据的空间累加和total += sizes[age];//如果累加和大于阈值,就直接跳出循环,假设磁盘的age等于3吧if (total > desired_survivor_size) break;age++;}//MaxTenuringThreshold上限是15,现在age是3,那么result就是等于3uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;...
}

上面这段代码,也证实了我的猜想:

真正的动态年龄判断:是年龄从小到大的对象占据的空间,大于survivor区域的一半,然后把等于或大于该年龄的对象,放入到老年代。

小结

这就是书本理理论和实践的差距吧。你不真正看一下源码,可能一直都以为书本说的是真的。这也从侧面说明了:源码无秘密。

补充知识

  • 大对象直接进入老年代。

    • 那多大的对象是大对象?大于下面参数的对象,就是大对象
    • 直接通过:-XX:PretenureSizeThreshold来配置
  • 动态年龄判断
    • 里面涉及到一个值,就是survivor区域的一半,其实也不一定是一半,你可以自定义的
    • 参数:-XX:TargetSurvivorRatio
  • 年龄大于阈值,进入老年代
    • 这个阈值:JDK8后,范围是1-15
    • 参数:XX:MaxTenuringThreshold

好了,说完了。有收获的话,记得点赞和转发哈哈哈。不然,打哭你(霸气侧漏)

JVM-动态年龄判断你真的理解了吗相关推荐

  1. JVM 动态年龄判断规则

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

  2. JVM 对象动态年龄判断

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

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

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

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

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

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

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

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

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

  7. jvm动态对象年龄判定

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

  8. 简单人物画像_你真的理解用户画像吗?| 船说

    " 「设计师沙龙」是ARK下半年开始逐渐形成的传统,由ARKers自发组织,分为视觉和交互两类,每月各举办一次.大家围绕一个话题展开,聊聊行业最新案例和工作上的心得,帮助大家共同进步. AR ...

  9. JVM原理和调优的理解和学习

    JVM原理和调优的理解和学习 一.详解JVM内存模型 二.JVM中一次完整的GC流程是怎样的 三.GC垃圾回收的算法有哪些 四.简单说说你了解的类加载器 五.双亲委派机制是什么,有什么好处,怎么打破 ...

最新文章

  1. before vue路由钩子_vue组件级路由钩子函数介绍,及实际应用
  2. 《图解HTTP》读书笔记(四:HTTP方法)
  3. 通过WM_COPYDATA消息完成进程间通信
  4. OpenStack 简介
  5. 清华美女学霸数学笔记曝光, 精美程度无与伦比
  6. 架构设计 | 分布式事务①概念简介和基础理论
  7. 政企上云网络适配复杂,看华为云Stack有妙招
  8. 遍历聚合对象中的元素——迭代器模式(四)
  9. perl DBD Informix install and test
  10. 袁永福的博客系列文章链接集合
  11. 【渝粤教育】国家开放大学2018年春季 0239-22T电子商务物流管理 参考试题
  12. 培训师之绕口令与气息练习
  13. Java调用Bing翻译
  14. JDBC简介,JDBC API,,MySQL连接、SQL语句
  15. PHP微信公众号开发之:获得和缓存access_token,原理及代码
  16. SpringBoot Hanlp的集成
  17. elasticsearch 生产级别深度优化
  18. 结对项目——二柱子再更新版
  19. STM32外部中断总结
  20. P4848 崂山白花蛇草水

热门文章

  1. windows电脑连接蓝牙耳机的正确步骤
  2. Python3网络爬虫--爬取歌词并制作GUI(附源码)
  3. 利用多态的思想写一个王者荣耀的框架
  4. Arcgis制图之自制符号库
  5. mysql 数据库备份到本地_如何备份远程 MySQL 数据到本地
  6. 经验分享:爱奇艺关闭自动续费会员的功能
  7. 【Android入门到项目实战-- 10.1】—— jsoup的详细使用教程
  8. web网页设计实例作业HTML+CSS+JavaScript蔬菜水果商城购物设计
  9. 软著申请容易吗?没材料怎么申请软件著作权证书?
  10. mysql上限_MySQL自增ID达到上限的解决方法