Java 中空类的大小10 Sept 2024 | 4 分钟阅读 在 Java 中,对象的大小是通过其实例变量大小的总和来确定的。然而,对于一个空类,即没有实例变量的类,关于它占用多少内存并没有一个明确的答案。这是因为 JVM(Java 虚拟机)有一个最小对象大小,通常是 8 字节,这是 Java 中可以分配的最小可能对象的大小。为了理解 Java 中空类的大小这一概念,让我们先讨论一下 Java 中的内存分配过程。当在 Java 中创建一个对象时,JVM 会在堆中分配内存来存储对象的实例变量。分配的内存大小取决于对象中实例变量的类型和数量。 然而,JVM 有一个最小对象大小,通常是 8 字节,这是 Java 中可以分配的最小可能对象的大小。这意味着即使对象没有实例变量,它仍然会占用 8 字节的内存。 让我们通过一个示例程序来更好地理解这个概念 这是一个没有任何实例变量的空类。让我们使用以下代码来确定这个类在 Java 中的大小 Size.java 输出 Size of EmptyClass object: 16 在上面的代码中,我们首先创建了一个 EmptyClass 的实例,然后使用 Runtime 类来计算 JVM 占用的内存。totalMemory() 方法返回 JVM 为应用程序分配的总内存量,freeMemory() 方法返回 JVM 中的可用内存量。通过将总内存减去可用内存,我们可以得到 EmptyClass 对象占用的内存量。如前所述,Java 中最小的对象大小通常是 8 字节。然而,在本例中,EmptyClass 对象的大小是 16 字节。这是因为 JVM 会为它分配的每个对象添加一些额外的元数据。对于空类,这些元数据包括一个指向类元数据的引用和一个指向类的方法元数据的引用。因此,即使 EmptyClass 没有实例变量,它仍然占用 16 字节的内存。需要注意的是,对象在 Java 中的实际大小可能会因 JVM 的实现、操作系统和硬件的不同而有所不同。 让我们来看另一个示例,以了解对象的大小如何根据其包含的实例变量而变化 在本例中,我们有一个名为 MyClass 的类,它有三个 int、char 和 boolean 类型的实例变量。让我们使用以下程序来确定这个类在 Java 中的大小 SizeOfClass.java 输出 Size of MyClass object: 16 从输出中可以看出,MyClass 对象的大小也是 16 字节。这是因为每个 int 变量占用 4 字节,char 变量占用 2 字节,boolean 变量占用 1 字节。因此,实例变量的总大小是 7 字节,但 JVM 向对象添加了 9 字节的元数据,导致总大小为 16 字节。需要注意的是,对象在 Java 中的大小也可能受到填充的影响。填充是添加额外字节到对象以确保其实例变量对齐到内存边界的技术。这可以通过使 CPU 更容易、更快地读写内存来提高性能。 例如,假设我们有一个类,其中有两个 int 变量 在本例中,两个 int 变量总共占用 8 字节(每个 4 字节)。然而,JVM 可能会向对象添加额外的填充字节,以确保 int 变量对齐到内存边界(通常是 4 字节)。这可能导致对象占用超过 8 字节的内存。 总之,Java 中空类的大小不是零,而是通常为 8 字节(Java 中的最小对象长度)。这是因为 JVM 会为它分配的每个对象添加一些额外的元数据,例如指向类元数据的引用和指向类的方法元数据的引用。Java 中对象的大小也可能受其包含的实例变量和填充的影响。需要注意的是,对象在 Java 中的实际大小可能会因 JVM 的实现、操作系统和硬件的不同而有所不同。 |
在 Java 中,每当我们尝试访问数组中不存在索引的任何项时,就会发生这种情况。换句话说,索引可能是负数或超过数组的大小。这是一个子类...
阅读 2 分钟
在 Java 中,当编译器期望一个类定义但遇到其他内容时,会发生“期望类”的错误。这通常是由于缺少花括号、语法错误或关键字放错位置引起的。确保正确的类声明、正确使用数据类型以及保持正确的结构有助于避免这种情况……
7 分钟阅读
? Null Pointer Exception 是一种运行时异常,当 Java 程序尝试使用包含 null 值的对象引用时抛出。在以下情况下可以抛出 Null Pointer Exception:1. 使用对象调用方法...
阅读 4 分钟
为了编写更灵活、可重用且类型安全的代码,开发人员需要使用 Java 编程语言的泛型功能。泛型最初在 Java 5 中可用,此后已成为任何 Java 开发人员工具箱中的关键组成部分。在本节中,我们……
阅读 4 分钟
在 Java 中,构造函数是在创建对象时调用的特殊方法。它们用于初始化对象状态并执行任何必要的设置。Java 构造函数的一个有趣特性是能够在其中调用另一个构造函数……
阅读 4 分钟
在面向对象编程中,封装是一个基本概念,它指的是隐藏对象的实现细节并提供访问其属性和行为的接口。访问器和修改器方法是与 Java 中的封装相关的两个重要概念。访问器访问器方法,也称为...
阅读 4 分钟
复合赋值运算符是将多个运算符组合在一起。它包括一个赋值运算符和一个算术运算符或按位运算符。在右操作数和左操作数之间执行指定的运算,并将结果赋给左操作数……
7 分钟阅读
java.util 包的内容与 DoubleSummaryStatistics 类有关。当使用高精度实数流并且需要收集 Double 对象时,它非常重要。它跟踪已处理值的总数,以及……
阅读 3 分钟
Java 不支持类之间的多重继承,以避免钻石问题,该问题在多个父类提供具有相同签名的时会引起歧义。然而,随着 Java 8 中默认方法的引入,通过接口支持多重继承。虽然这增加了灵活性,但冲突...
阅读 6 分钟
树的边界遍历是一种特殊的二叉树遍历技术,其中节点以特定顺序访问,以覆盖树的外部边界。在此遍历中,我们的目标是访问位于树外围的节点,包括左...
阅读 15 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India