Java 作为面向对象的编程语言,为我们提供了丰富的特性,使得代码更加易于维护和扩展。然而,一个常见的疑问是:我们创建的 Java 对象究竟占用多少内存空间呢?本文将通过分析 Java 对象的内存模型,揭开这一谜团。
本文环境设定为 JDK 1.8 和 64 位虚拟机。在探讨 Java 对象的内存模型之前,我们先了解一个基本概念:每个 Java 对象都包含两部分:Mark Word 和 Klass Word。Mark Word 是锁实现原理中的关键部分,而 Klass Word 则包含元数据和方法信息,用来描述 Java 类。
在 64 位虚拟机的环境下,开启指针压缩后,Klass Word 占用 32 位空间,而 Mark Word 占用 64 位空间。因此,一个 Java 对象的内存占用至少为 96 位,即 12 字节。这是对象头的固定占用空间,无论对象内部是否包含属性。
接下来,我们使用代码验证上述内存模型。利用 openjdk 的 JOL 工具,我们可以查看对象的内存占用情况。通过新建一个普通的类,我们发现一个空对象占用 16 字节的内存。这是因为对象头和虚拟机填充的额外字节共同导致了这一结果。
在实际应用中,我们更关心的是非空对象的内存占用情况。这里,我们将创建一个包含其他对象的类来分析。通过代码执行,我们发现 TestNotNull 类占用 24 字节的内存,其中包括 12 字节的对象头、4 字节的 int 类型变量、4 字节的引用变量,以及为了内存对齐填充的 4 字节。因此,非空对象的实际占用内存为 24 字节。
最后,我们需要计算非空对象中实际对象的内存占用。以 NullObject 为例,它的内存占用为 16 字节。因此,整个对象的总内存占用为 24 字节(非空对象)+ 16 字节(NullObject)= 40 字节。
通过本文的分析,我们可以了解到 Java 对象内存占用的基本原理,以及如何使用 JOL 工具进行验证。掌握这些知识有助于我们更加高效地使用 Java,避免不必要的内存浪费。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。