对象实例化、内存布局与访问定位
2021-09-15 11:07:50 0 举报
AI智能生成
对象实例化、内存布局与访问定位
作者其他创作
大纲/内容
对象实例化
new
Class的newInstance
Constructor的newInstance
clone
反序列化
第三方库Objensis
实例化的过程
检查是否加载、链接、初始化
分配内存空间
连续内存
指针碰撞
不连续内存
虚拟机需要维护一个列表
空闲列表分配
并发性问题
CAS分配失败后加锁机制保证原子性一致
每个线程预分配一个TLAB
初始化分配到的空间
为对象的每个实例属性赋值,保证没有实例属性再不赋值时可直接使用
设置对象的头信息
执行init方法进行初始化
内存布局
对象头(Header)
运行元数据
哈希值
GC分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间锁
类型指针
指向类元数据instanceKlass,确定该对象所属的类型。
实例数据(Instance Data)
说明:它是对象真正存储的有效信息,也包括程序代码中定义的各种类型的字段。
规则:
相同宽度的对象总是被分配在一起
父类中定义的变量出现在子类之前
如果CompactField参数为true,子类的窄变量可能插入到父类变量的空隙
对其补充
不是必须的,无特殊意义,仅仅起到占位符的作用。
对象的定位访问
目的:JVM创建对象的目的就是为了使用它
JVM是如何通过栈帧中的对象引用访问到其内部的实例对象呢
对象访问的方式主要有两种:
句柄访问
直接访问(HotSpot)采用
面试题
美团 : 对象在VM中是怎么存储的?对象头信息里面有哪些东西?
蚂蚁金服 : 二面 : java对象头里有什么
蚂蚁金服 : 二面 : java对象头里有什么
0 条评论
下一页