JVM中对象进入老年代的3种情况
1. 对象年龄达到阈值后进入老年代
默认情况下,对象在新生代经历了15次GC后,便会达到进入老年代的条件,将对象转移进入老年代。当然,年龄的阈值可以通过JVM参数进行设置:
-XX:MaxTenuringThreshold=10
2. 大对象直接进入老年代
通过以下JVM参数进行设置:(注意此参数仅适用于Serial和ParNew两款新生代收集器。)
-XX:PretenureSizeThreshold=5242880
其中5242880即为5MB(5*1024*1024),意味着对象大于5MB直接进入老年代
public void test(){byte[] array=new byte[6*1024*1024];
}
原因:
a. 大对象需要连续的内存空间,而新生代为了安放大对象可能需要多次进行GC,增加开销;
b. 新生代种伊甸园区和幸存者区常采用复制算法,需要经常复制对象到不同的区域,而大对象在复制时开销较大。
3. 动态地根据对象地年龄以及新生代空间使用情况选择对象进入老年代
HotSpot虚拟机并不一定会严格按照设置的年龄阈值,满足以下条件也能直接进入老年代:Survivor 区中,年龄从 1 到 n 的对象大小之和超过 Survivor 区的 50% 时,新生代中年龄大于等于 n 的对象将进入老年代。
注意一个误区:这个对象大小总和是按年龄从小到大累加的,并不是同龄对象!
在《深入理解java虚拟机》这本书中是这样说的:
如果在Survivor空间中相同年龄所有对象大小的总和大于 Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到-XX: MaxTenuringThreshold中要求的年龄。
但如果是同龄对象,那么意味着假设对象年龄为1,超过一半就得把所有对象放进老年代,且再分析一下,随着Minor GC,对象年龄只会越来越大,同龄对象只会越来越少,意味着若是同龄对象,那么对象年龄只能为1。
又或者是假设 Survivor 区中对象年龄各不同,如果是同龄对象而不是从小累加的话,那么老年代始终为空,Survivor 区始终是满的,不符合正常现象。
另外,这个50%也是可以通过参数设置的:(默认50%)
-XX:TargetSurvivorRatio
JVM中对象进入老年代的3种情况相关推荐
- 045、JVM实战总结:动手实验:自己动手模拟出对象进入老年代的场景体验一下(上)
1.前文回顾 略.. 2.动态年龄判定规则 进入老年代的4个时机:1.年龄到了 2.动态年龄判断 3.Survivor 放不下 4.大对象(G1例外) 动态年龄判断:Young GC时,新对象(1岁) ...
- jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
文章目录 Pre 动态年龄判定规则 动态年龄判定规则的部分示例代码 部分示例代码运行后产生的gc日志 完善示例代码 GC日志分析 Pre 上一篇文章我们已经带着大家初步分析了一次Young GC的日志 ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- Java虚拟机笔记(五):JVM中对象的分代
为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...
- java对象从新生代晋升到老年代的四种方式
晋升的四种方式 担保机制 大对象直接进入老年代 长期存活的对象 动态年龄判断 1.担保机制 1.1什么是担保机制 我们都用过花呗借呗.或者信用卡吧? 就是你身上的前不够用的时候,你可以去借信用卡.借花 ...
- 理解JVM中对象与垃圾回收机制
目录 一.虚拟机中对象的创建过程 1.检查加载 2.分配内存 3.内存空间初始化 4.设置(主要是对象头信息) 5.对象初始化 二.对象的内存布局 三.对象的访问定位 四.判断对象存活 五.各种引用 ...
- [转载] JVM中对象的回收过程
参考链接: JVM是否创建Main类(具有main()的类)的对象 当我们的程序开启运行之后就,就会在我们的java堆中不断的产生新的对象,而这是需要占用我们的存储空间的,因为创建一个新的对象需要分配 ...
- 3V、5V混合系统中不同电平器件接口的4种情况
一. 3V.5V混合系统中不同电平器件接口的4种情况 为了保证在混合电压系统中数据交换的可靠性,必须满足输入转换电平的要求,但又不能超过输入电压的限度.图1就是各种转换电平的例子: TTL电平 ...
- JVM年轻代,老年代,永久代详解
前言 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.本篇文章主要讲解内存区域的年轻代,老年代和永久代,略微提及一些垃圾回收算法,下面是正文. 堆整体 堆主 ...
最新文章
- clion 远程连接linux服务器 开发调试
- 灾难恢复级别_防患于未然:灾难恢复全攻略,助你有效恢复业务数据
- python小白-day4递归和算法基础
- vue+express 构建后台管理系统
- ios修改了coredata数据结构后,更新安装会闪退
- python 数据框缺失值_Python:处理数据框中的缺失值
- priority_queue(优先队列)的简单构造与用法
- c语言参数传入函数赋值后传出来,c语言第10次实验内容函数2邹显春.ppt
- mayaa的一些代码
- 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名查询...
- android全局屏幕自动旋转,如何在Android中全局强制屏幕方向?
- 电感耦合等离子体发射光谱法测定水样中的金属含量
- MongoDB 分片集群搭建
- 睡不着听什么音乐睡得快,失眠入睡音乐歌单推荐
- linux批量删除指定名称的文件夹
- 自举电路工作原理和自举电阻和电容的选取
- 向来痴,从此醉,先生一路走好。
- FreeMarkerBase
- 转载给浮躁的软件业同仁 (作者不是我,但是确实是好文)
- vue router meth的2个属性: keepAlive 、deepth