对象的内存布局
请解释一下对象的创建过程
- 加载
- 验证
- 准备
- 解析
- 初始化
- 申请对象内存
- 成员变量赋予默认值
- 调用构造方法
- 成员变量顺序赋予初始值
- 执行构造方法语句
对象在内存中的存储布局
观察虚拟机的配置
java -XX:PrintCommandLineFlags -version
普通对象
- 对象头 : markword 8【GC了多少次】
- ClassPointer :-XX:+UseCompressedClassPointers 为 4字节,不开启为 8 字节 【属于哪个Class】
- 实例数据
- Padding对齐,8的倍数
数组对象
- 对象头
- ClassPointer
- 数组数据
- 数组长度【Array length】
- 对齐 8 的倍数
一个对象多少字节【16个字节】
-XX:+UseCompressedClassPointers : 类的引用
-XX:_UseCompressedOops : string 的引用
Oops = ordinary object pointers
- 对象头 8个字节
- 压缩指针 4个字节
- padding 4个字节
对象头具体包括什么
GC年龄默认是 15 :分代年龄 4 bit 0 ~ 15
markword 64 位
IdentityHashCode
当一个对象计算过 idetityHashCode 之后,不能进入偏向锁状态
当无锁的状态计算 HashCode 时,他就无法进入偏向锁状态
对象定位
- 句柄池【找一个间接的指针,再找引用】
- CMS 垃圾回收较快
- 直接指针【直接引用】