首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java :内部类的大小

Java :内部类的大小
EN

Stack Overflow用户
提问于 2012-08-30 16:47:25
回答 8查看 3.2K关注 0票数 14

我有这样一门课:

代码语言:javascript
运行
复制
public class Stack {

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

}

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

代码语言:javascript
运行
复制
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对应的是什么。你能解释一下吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-08-30 16:54:30

对象开销

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

内部类额外开销

因为您的内部类不是静态的,所以它有一个对外部类的引用。

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2012-08-30 16:54:36

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-08-30 16:52:26

你可以在这里找到答案:What is the memory overhead of an object in Java?

更详细的答案在这里:

Java中的对象内存使用:http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

Java heap上的对象的

实例并不只是为它们的实际字段占用内存。不可避免地,它们还需要一些“内务”信息,如记录对象的类、ID和状态标志,如对象当前是否可访问、当前是否同步锁定等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12193116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档