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方法用于获取对象字段的内存偏移量。此方法考虑了对象在内存中的布局,包括对象头、Oop指针、数据区和内存对齐等。在64位机器上,对象会进行8字节对齐,对象头、Oop指针(可能压缩)和数据区按照特定顺序排列,引用类型和基本数据类型的大小也会影响内存布局。
84万+

被折叠的 条评论
为什么被折叠?



