jvm对象创建和内存分配机制
2020-06-29 10:24:34 0 举报
jvm内存分配模型图
作者其他创作
大纲/内容
空闲
保证更新操作的原子性
可达性分析
引用类型
目的:为了减少64位平台下内存的消耗,启用指针压缩功能
对象
标量
开启逃逸分析参数(-XX:+DoEscapeAnalysis)关闭逃逸分析参数(-XX:-DoEscapeAnalysis)
强引用public static User user = new User();
内存
引用计数器
GC分代年龄
开启标量替换参数-XX:+EliminateAllocations
长期存活
出栈销毁(减少GC)
15次
64位(小于32G)
指针碰撞
动态分代年龄
32位(最大4G内存)
准备(赋初始值)
类型指针(klass pointer)
实例对象
JVM会默认开启XX:+UseTLABXX:TLABSize 指定TLAB大小。
-XX:-UseAdaptiveSizePolicy 8:1:1
指针压缩
将“GC Roots” 对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等
survivor
指示器
栈上分配内存
会强制使用64位(即8字节)来对java对象寻址
对象内存分配
链接
并发
分解成员变量
大对象直接进入老年代
启用指针压缩:XX:+UseCompressedOops(默认开启)
分配担保机制
覆盖finalize方法,只会拯救一次,只要重新与引用链上的任何的一个对象建立关联即可
哈希码
对象指针
-XX:PretenureSizeThreshold 可以设置大对象的大小,超过直接进入老年代(仅限Serial 和ParNew收集器)
偏向时间戳
聚合量
Eden:Survivor=8:2(from:to = 1:1)
线程持有的锁
老年代
弱引用public static WeakReference<User> user = new WeakReference<User>(new User());
偏向线程ID
编码
初始化
可拆解
不可拆解
空闲列表
虚引用虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系,几乎不用
运行时数据
被外部引用(逃逸)
是否大于之前每一次minor gc后进入老年代的对象的平均大小
finalize()方法
cms 6次
没有被外部引用(未逃逸)
对齐填充(Padding)
禁止指针压缩:XX:UseCompressedOops
栈分配
设置对象头
第一次标记并进行一次筛选筛选的条件是此对象是否有必要执行finalize()方法当对象没有覆盖finalize方法,对象将直接被回收
初始化(真实值)
软引用public static SoftReference<User> user = new SoftReference<User>(new User());
解决方案
无法解决循环依赖
逃逸分析
锁状态标志
年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代
minor gc之前JVM会计算下老年代剩余可用空间(可用空间小于年轻代里现有的所有对象大小之和(包括垃圾对象))
实例数据
-XX:+UseAdaptiveSizePolicy(默认开启)会导致这个8:1:1比例自动变化
其他收集器
解码
分代年龄
堆分配
CAS(compare and swap)
对象分配内存空间
Eden区
不开启指针压缩jvm会直接去除高32位地址,即使用低虚拟地址空间
<init>
标量替换
Eden区满,直接GC
mark word
大于32G
0 条评论
回复 删除
下一页