对象内存中可以分为三块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),以64位操作系统为例(未开启指针压缩的情况)Java对象布局如下图所示:
这是网上很多人都会提到的一个问题,那么结合上面的Java内存布局,我们来分析下,以64位操作系统为例,new Object()占用大小分为两种情况:
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.10</version> </dependency>
import org.openjdk.jol.info.ClassLayout; public class HeapMemory { public static void main(String[] args) { Object obj = new Object(); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); } }
最后的结果是16字节,没有问题,这是因为默认开启了指针压缩,那我们现在把指针压缩关闭之后再去试试。
-XX:+UseCompressedOops 开启指针压缩 -XX:-UseCompressedOops 关闭指针压缩
再次运行,得到如下结果:
新建一个类,内部只有一个byte属性:
public class MyItem { byte i = 0; }
开启指针压缩,占用16字节:
关闭指针压缩,占用24字节:
....
https://mp.weixin.qq.com/s/YJsTPd7YDzBqdWsNxnygrA