目录

ThasBlog

学无止境

X

JAVA 对象头

对象头结构

image.png

偏向锁与hash不能共存, 一旦计算过hash, 对象就不可偏向.
对象头中的 bl:1 代表是否可偏向, 若不可偏向, 则前 56 位可以用来表示 hash 值, 若可偏向, 则前 56 位必不表示 hash 值, 可以用来表示偏向的线程 ID

image.png

Object 没有属性, 所以除了对象头就没有其他内容了, 根据 8 字节对齐, 自动填充了 4 字节

Object[]数组会额外使用 4 字节保存长度, 所以数组的最大长度为整形; 后面则是顺序存储的全部元素的指针, 由于开启了指针压缩, 每个都是 4 个字节.

image.png

指针压缩

32 位CPU的最大寻址空间为 2^32, 如果这些寻址空间指向 bit 位, 那么最大支持的内存为 512M; 但是 CPU 存储数据的时候都是以 8bit 为一组, 也就是 1byte; 把寻址空间指向 byte 组, 就可以让最大支持内存增加到 4G. JVM指针压缩原理相同.
64位 JVM 最大寻址空间是 2^64, 寻址空间指向 byte组, 则最大可支持 2^34G 内存; 但是存储 64 位指针会让内存占用提高. 由于 JVM 中对象都是 8byte 对齐的, 所以让指针指向 8byte 组, 则 32 位指针能够表示的最大内存可以提高到 32G. 这对于一般 JAVA 应用而言已经足够了, 指针所占用的内存空间也降低了. 所以指针压缩一般是开启的.
堆内存小于 4G 的时候, 直接去掉高位指针, 实际上不是指针压缩
支持指针压缩的指针:

  1. 类的静态成员引用
  2. 对象头的类型指针
  3. 对象引用
  4. 对象数组引用

不支持压缩

  1. 非堆上的引用, 比如元空间
  2. 局部变量, 传参, 返回值, NULL

标题:JAVA 对象头
作者:thas
地址:https://thas.cc/articles/2020/12/14/1607958194047.html