sun.misc.Unsafe 是JDK内部用的工具类。它通过暴露一些Java意义上说“不安全”的功能给Java层代码,来让JDK能够更多的使用Java代码来实现一些原本是平台相关的、需要使用native语言(例如C或C++)才可以实现的功能。该类不应该在JDK核心类库之外使用。

JVM的实现可以自由选择如何实现Java对象的“布局”,也就是在内存里Java对象的各个部分放在哪里,包括对象的实例字段和一些元数据之类。sun.misc.Unsafe里关于对象字段访问的方法把对象布局抽象出来,它提供了objectFieldOffset()方法用于获取某个字段相对Java对象的“起始地址”的偏移量,也提供了getInt、getLong、getObject之类的方法可以使用前面获取的偏移量来访问某个Java对象的某个字段。

关于对齐:

64位机器普通对象:

  1. 对象头(_mark), 8个字节
  2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节
  3. 数据区

4.Padding(内存对齐),按照8的倍数对齐—用于补齐8的倍数,凑整;

5、引用类型是:4个字节,我认为就是Oop指针;

java的基本数据类型:byte,short,int,long,float,double,char,boolean(脑补他们分别占几个字节)

从长到短排列,引用排最后: long/double –> int/float –> short/char –> byte/boolean –> Reference



AtomicInteger中static块的unsafe.objectFieldOffset作用插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://choupangxia.com/2022/07/20/unsafe-objectfieldoffset/