jvm对象创建过程和存储布局
java并发内存模型
- 工作内存为java线程的内存
- 主内存为JVM内存
- voliatile 会让每个线程实时读取主内存数据
对象的创建过程
- class loading 加载class到内存汇总
- class linking
- verification 校验是否语句满足JVM规范
- preparation 初始化提供默认值
- resolution class解析
- class initializing 提供初始值
- 申请对象内存
- 成员变量赋默认值
- 调用构造方法
- 成员变量顺序赋初始值
- 执行构造方法(如果有父类,先加载父类)
前三步是加载class 过程
后面三步是加载对象的过程
对象在内存中的存储布局
普通对象
- 对象头:markword 8字节
- ClassPointer指针
-XX:+UseCompressedClassPointers 为4字节 不开启为8字节 (是否压缩)
指向引用对象 - 实例数据
引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节 Oops Ordinary Object Pointers
数据存储值 - Padding对齐
8的倍数,便于jvm读取
数组对象
- 对象头:markword 8
- ClassPointer指针同上
- 数组长度:4字节 (比普通对象对一个数组长度)
- 数组数据
- 对齐 8的倍数
Object o = new Object() 占多少字节 16
- markword 8字节
- ClassPointer 4字节(压缩)
- Padding 补齐字节为8的倍数 4字节
对象头包含什么
- 锁定信息 2位
- 垃圾回收次数
IdentityHashCode的问题
- 当一个对象计算过identityHashCode之后,不能进入偏向锁状态
https://cloud.tencent.com/developer/article/1480590 https://cloud.tencent.com/developer/article/1484167
https://cloud.tencent.com/developer/article/1485795
https://cloud.tencent.com/developer/article/1482500