你真的了解Java对象吗
一、什么是Java对象
Java对象是一类事物的抽象,有状态和行为。
二、Java对象的创建过程
2.1、Class加载
2.2、Class 链接 (验证、准备、解析)
2.3、申请对象内存
2.4、成员变量赋默认值
2.5、调用构造方法
1、成员变量赋初始值
2、执行构造方法语句
三、Java对象的布局、结构
4.1、普通对象
1、对象头 markword
2、ClassPointer指针 (启动参数 -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)
3、实例数据 (引用类型, -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)
4、Padding对齐 8的倍数
4.2、数组对象
1、对象头 markword
2、ClassPointer指针 (启动参数 -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)
3、数组的长度
4、实例数据 (引用类型, -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)
5、Padding对齐 8的倍数
四、Java对象头的结构
对象头包含两部分内容:
1、对象的状态信息
对象的锁信息(2位标识当前对象锁的状态,记录锁升级后,当前对象是何种锁),hashcode信息
2、类型指针
通过类型指针了解对象时哪个类的实例
五、对象的访问/对象的定位
1、句柄
相较于直接指针方式,通过句柄方式访问对象的速率慢,但垃圾回收速率快
2、直接指针
相较于句柄方式,通过直接指针方式访问对象的速率快,但垃圾回收速率慢
六、对象的大小
针对64位,Object o = new Object(); 在内存中占用了多少字节
1、markword 8字节
2、UseCompressed 开启压缩 4字节, 不开启压缩 8字节
3、实例数据 0 字节
4、Padding对齐 8的倍数
综上:
开启压缩占用字节: 8 + 4 = 12 , 因为Padding对齐, 12 + 4 = 16
不开启压缩占用字节: 8 + 8 = 16, 不需要padding对齐
结论:
Object o = new Object();占用16字节。