JVM - 对象
2021-03-13 12:29:19 25 举报
AI智能生成
JVM - 对象
作者其他创作
大纲/内容
创建对象的步骤
1、判断对象对应的类是否加载、链接、初始化
2、为对象分配内存
如果内存规整
指针碰撞
如果内存不规整
虚拟机需要维护一个列表
空闲列表分配
说明
3、处理并发问题
采用cas失败重试、区域加锁保证更新的原子性
每个线程预先分配一块TLAB 通过 -XX:+UseTLAB参数来设定
4、初始化分配到的空间
所有属性设置默认值、保证对象实例字段在不赋值时可以直接使用
5、设置对象的对象头
6、执行init方法进行初始化
对象访问定位
图示
创建对象的目的是为了使用它
jvm是如何通过栈帧中的对象引用访问到其内部的对象实例的呢?
定位,通过栈上reference访问
对象访问方式只要有两种
句柄访问
图示
子主题
实现
好处
直接指针(Hotspot采用)
图示
实现
好处
创建对象的方式
new
class的newInstance
clone()
使用反序列化
使用第三方库
内存布局
对象头(Header)
包含两部分
运行时元数据(Mark Word)
哈希值(HashCode)
GC分代年龄
锁状态标示
线程持有的锁
偏向线程id
偏向时间戳
类型指针
- 指向类元数据instanceClass,确定该对象所属的类型
说明:如果是数组,还需要记录数组的长度
实例数据(Instance Data)
说明
它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)
规则
相同宽度的字段总量被分配在一起
父类中定义的变量会出现在子类之前
如果compactFields参数为true,子类的窄变量插入到父类变量的空隙
对齐填充(Padding)
不是必须的,也没特别含义,仅仅起到占位符的作用
小结:图示
收藏
收藏
0 条评论
下一页