Java对象的内存布局
-
对象头
-
Mark Word
-
类对象指针
-
数组长度(可选)
-
-
对象体
-
对齐字节(可能不存在)
对象头
Mark Word
-
占一个字大小(64位虚拟机尾64字节/字)
-
lock位决定了整个Mark Word的布局和含有
-
由如下几部分的某些字段组成:
-
lock,表示锁状态
-
biased_lock,是否是偏向锁
-
age,分代年龄
-
identity_hashcode,哈希码(计算没重写的hashcode方法和identity_hashcode方法时写入)
-
thread,偏向的线程ID
-
epoch,偏向时间戳
-
ptr_to_lock_record,轻量级锁状态下指向栈帧中锁记录的指针
-
ptr_heavyweight_monitor,重量级锁状态下指向对象监视器的指针
-
类对象指针
-
指向方法区中类对象类型的指针
-
保存的是方法区Class对象的地址
-
根据是否开启压缩,为 64位 / 32位
数组长度
如果该对象是数组的话,需要记录数组长度的字段
对象体
-
存放对象的实例变量,用于成员属性变量(包括父类成员属性)
-
按4字节对齐
对齐字节
对象的起始内存地址必须是8字节的数倍,不够则使用对齐字节对齐
访问对象的两种方式
HotSpot使用的是直接指针
句柄
-
堆中有句柄池
-
访问实例数据需要两次引用
-
GC发生,对象的实例数据内存地址可能改变,需要修改句柄中的实例数据指针
直接指针
-
访问实例数据需要一次引用
-
GC发生,对象的实例数据内存地址可能改变,需要修改栈中本地变量表中的
reference
大小端问题
-
x86系列CPU,小端模式
-
JVM的字节存放,小端模式
-
网络通信,大端模式
-
小端模式,高字节存在高位,低字节存在低位
-
示例:
-
0X1234abcd(十六进制数)
-
cd,ab,34,12(内存分配)
-