Java:内部类的大小

2022-09-04 02:41:27

我有这个类:

public class Stack {

   private class Node {
       String item;
       Node next;
   }
   // some other methods here

}

在我的书中,作者说每个堆栈节点的大小为40字节,包括:

16 bytes (object overhead)
8 bytes (inner class extra overhead)
8 bytes (references to string)
8 bytes (references to node)
----------------------------------------------
40 bytes per stack node

我知道最后两件事是指对字符串和节点的引用的大小。但我不知道和对应什么。您能解释一下吗?object overheadinner class extra overhead


答案 1

对象开销

每个对象都有一个标头,通常长度为 8-12 个字节。每个对象也是8字节对齐的,一个简单的估计是你说它大约16字节长。

内部类额外开销

由于内部类不是静态的,因此它具有对外部类的引用。

如果这是一个匿名的内部类,你可能拥有任意数量的最终变量(在匿名类代码中使用的任何变量)的副本。

8 字节(内部类额外开销) 8 字节(对字符串的引用) 8 字节(对节点的引用)

大多数 JVM 使用 32 位引用,因此大小为 4 个字节。即使堆数高达 32 GB 的 64 位 JVM 也可以使用 32 位引用。


答案 2

首先:您引用的所有具体数字都非常依赖于实现,并且可能会根据您使用的JVM而有很大差异。

但是,大多数 JVM 将具有相似的值(例如,大多数 JVM 使用对象标头)。

对象标头包含 JVM 跟踪对象所需的“簿记”信息。例如,它通常包含指示对象确切类型的内容。

您所说的“内部类额外开销”可能是指非静态内部类的每个实例都“绑定”到外部类的实例。您可以将其视为如下所示的隐式字段:。实际上,您可以通过在 代码中引用 来实际使用该值。该 implcit 字段将占用与普通引用变量相同的内存量(通常为 4 或 8 个字节,具体取决于您的体系结构/JVM)。private final Stack Stack_thisStack.thisNode


推荐