「阿里巴巴」程序员最爱new对象,可是,你真的知道一个对象占用多少内存吗?( 三 )


public static void main(String[
args) {
//打印实例的内存布局
System.out.println(ClassLayout.parseInstance(new TestNotNull()).toPrintable());
//打印对象的所有相关内存占用
System.out.println(GraphLayout.parseInstance(new TestNotNull()).toPrintable());
//打印对象的所有内存结果并统计
System.out.println(GraphLayout.parseInstance(new TestNotNull()).toFootprint());

结果如下:
我们可以看到TestNotNull的类占用空间是24字节 , 其中头部占用12字节 , 变量a是int类型 , 占用4字节变量nullObject是引用 , 占用了4字节 , 最后填充了4个字节 , 总共是24个字节 , 与我们之前的预测一致 。 但是 , 因为我们实例化了NullObject这个对象一会存在于内存中 , 所以我们还需要加上这个对象的内存占用16字节 , 那总共就是24bytes+16bytes=40bytes 。 我们图中最后的统计打印结果也是40字节 , 所以我们的分析正确 。
这也是如何分析一个对象真正的占用多少内存的思路 , 根据这个思路加上openJDK的jol工具就可以基本的掌握自己写的\"对象\"究竟败家了你多少内存 。
总结本文我主要讲述了如何分析一个Java对象究竟占用多少内存空间 , 主要总结点如下:
1. Java对象头部内存模型在32位虚拟机和64位虚拟机是不一样的 , 64位虚拟机又分为开启指针压缩和不开启指针压缩两种对象头模型 , 所以总共有3种对象头模型 。
2. 内存对齐主要是因为平台的原因和性能的原因 , 本文主要解析的是性能方面的原因 。
3. 空对象的内存占用计算注意要计算内存对齐 , 非空对象的内存计算注意加上引用内存占用和原实例对象的空间占用 。