对象创建过程(6步)
1.类装载 装载class文件形成Class对象
2.类链接 检验 是否符合jvm规范、准备 为静态属性开辟空间并赋默认值、解析 将符号变量换为真正得地址
3.类初始化 静态赋初始值,执行静态代码块
----------至此Class对象创建完毕----------------
4.是申请对象内存成员属性赋默认值
5.调用构造方法 成员属性赋初始值,执行构造中的代码
6.变量指向该处内存
前三部如果执行过,再创建就无需重复执行了
对象内存布局
对象大小
## 对象大小(64位机 寻址2的64,所以地址指针不压缩的话需要8个字节,默认是压缩的4个字节,但是一旦寻址超过2的32位,压缩自动失效)
### 观察虚拟机配置
java -XX:+PrintCommandLineFlags -version
### 普通对象
1. 对象头:markword 8
2. ClassPointer指针:-XX:+UseCompressedClassPointers 为4字节 不开启为8字节
3. 实例数据
1. 引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节
Oops: Ordinary Object Pointers
4. Padding对齐,8的倍数
### 数组对象
1. 对象头:markword 8
2. ClassPointer指针同上
3. 数组长度:4字节
4. 数组数据:数组长度*单个属性或属性引用(同样受制于UseCompressedOops)的长度
5. 对齐 8的倍数
对象头 markword详解:
由图中可知当对象计算了identityHashCode时偏向锁的偏向线程id被占用,所以该对象无法进入偏向锁状态
对象定位:
hotspot使用的是直接指针 寻找快
有些其他jvm句柄池 GC快