(四)Java对象内存布局

128 阅读2分钟

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使用的是直接指针

image.png

image.png

句柄

  • 堆中有句柄池

  • 访问实例数据需要两次引用

  • GC发生,对象的实例数据内存地址可能改变,需要修改句柄中的实例数据指针

直接指针

  • 访问实例数据需要一次引用

  • GC发生,对象的实例数据内存地址可能改变,需要修改栈中本地变量表中的reference

大小端问题

  • x86系列CPU,小端模式

  • JVM的字节存放,小端模式

  • 网络通信,大端模式

  • 小端模式,高字节存在高位,低字节存在低位

  • 示例:

    • 0X1234abcd(十六进制数)

    • cd,ab,34,12(内存分配)