对象的创建过程
- classload 类加载
- class linking 校验文件符合jvm规范 准备 解析
- class initializing 初始化(调用类的,给静态成员变量赋值)
- 申请对象内存
- 成员变量赋默认值
- 调用构造方法 1.成员变量顺序赋值初始值 2.执行构造方法语句
对象内存布局
普通对象
1.对象头 8字节
2.class pointer指针:-XX:+UseCompressedClassPointers 4个字节,不开启为8个字节
3.实例数据: 引用类型:-XX:+UseCompressedOops 4个字节,不开启为8个字节
4.padding对齐:8的倍数
数组对象
1.对象头 8字节
2.class pointer指针:-XX:+UseCompressedClassPointers 4个字节,不开启为8个字节
3.数组长度 4字节
4.数组数据
5.padding对齐:8的倍数
hostpot开启内存压缩的规则(64位机器)
4G以下 直接砍掉高32位
4G-32G 默认开启内存压缩 class pointer和 Oops
32G 压缩无效,使用64位
对象头
Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。
java对象的最大年龄只能是15,因为只有4位。
hashCode方法和System.identityHashCode()会让对象不能使用偏向锁,所以如果想使用偏向锁,那就最好重写hashCode方法。
markword 32位
markword 64位
对象定位
- 句柄池
- 直接指针