一个Java对象究竟占多少内存空间?

在 64 位虚拟机的环境下,开启指针压缩后,Klass Word 占用 32 位空间,而 Mark Word 占用 64 位空间。因此,一个 Java 对象的内存占用至少为 96 位,即 12 字节。这是对象头的固定占用空间,无论对象内部是否包含属性。接下来,我们使用代码验证上述内存模型。利用 openjdk 的 JOL 工具,我们可以...
一个Java对象究竟占多少内存空间?
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,避免不必要的内存浪费。2024-10-18
mengvlog 阅读 7 次 更新于 2025-07-19 06:00:22 我来答关注问题0
  •  翡希信息咨询 一个Java对象究竟占多少内存空间?

    一个空对象在64位虚拟机且开启指针压缩的环境下,由于对象头和虚拟机填充的额外字节,可能占用16字节的内存。一个包含int类型变量和引用变量的非空对象,可能占用24字节的内存。总结:一个Java对象的内存占用空间取决于对象头、实例数据、内存对齐以及虚拟机填充等多个因素。在64位虚拟机且开启指针压缩的环...

  •  翡希信息咨询 一个Java对象到底占用多大内存

    int 和 Integer:在Java中,int 是基本数据类型,占用 4B的内存。Integer 是 int 的包装类,在堆内存中通常也占用 4B。double 和 Double:double 是基本数据类型,占用 8B的内存。Double 是 double 的包装类,在堆内存中通常也占用 8B。String对象:String对象的内存占用取决于其字符数组的长度。每个字...

  • 在 64 位虚拟机的环境下,开启指针压缩后,Klass Word 占用 32 位空间,而 Mark Word 占用 64 位空间。因此,一个 Java 对象的内存占用至少为 96 位,即 12 字节。这是对象头的固定占用空间,无论对象内部是否包含属性。接下来,我们使用代码验证上述内存模型。利用 openjdk 的 JOL 工具,我们可以...

  • 1. 使用JDK8自带API:为实现这一目标,首先确保已设置环境变量。运用这一方法时,通过调用Java类库中的特定方法,可以直接获取到对象的内存使用情况。2. 利用Apache Lucene工具类:在对象包含多个属性且需要计算整体内存大小时,Apache Lucene提供了一套工具类。使用前,通过Maven引入其依赖。具体实现通过编写...

  •  文暄生活科普 为什么jvm要用到压缩指针?java对象要求8字节的整数倍?

    针对Java对象为何要求8字节的整数倍这一问题,这与Java对象在内存布局中的对象对齐机制息息相关。对象对齐的目的是为了提高CPU访问内存效率,确保内存访问的自然性。如long和double类型变量需要占用8个字节,并且对齐到8字节的整数倍以实现自然对齐。因此,为了确保成员变量的自然对齐,Java对象大小通常被设计为...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部