我有这样一门课:
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 overhead
和inner class extra overhead
对应的是什么。你能解释一下吗?
发布于 2012-08-30 16:54:30
对象开销
每个对象都有一个标头,通常为8-12字节长。每个对象也是8字节对齐的,一个简单的估计是它大约有16个字节长。
内部类额外开销
因为您的内部类不是静态的,所以它有一个对外部类的引用。
如果这是一个匿名内部类,那么您可能拥有任意数量的final变量(匿名类代码中使用的任何变量)的副本。
8字节(内部类额外开销)8字节(对字符串的引用)8字节(对节点的引用)
大多数JVM使用32位引用,因此大小为4字节。即使是堆容量高达32 GB的64位JVM也可以使用32位引用。
发布于 2012-08-30 16:54:36
首先:您引用的所有具体数字都非常依赖于实现,并且可能会根据您使用的JVM而变化很大。
但是,大多数JVM将具有类似的值(例如,大多数JVM使用对象标头)。
object头包含JVM跟踪对象所需的“记账”信息。例如,它通常包含一些指示对象的确切类型的内容。
您所说的“内部类额外开销”可能是指非静态内部类的每个实例都“绑定”到外部类的实例。您可以将其视为一个隐式字段,如下所示:private final Stack Stack_this
。实际上,您可以通过在Node
的代码中引用Stack.this
来实际使用该值。implcit字段将占用与普通引用变量相同的内存量(通常为4或8字节,具体取决于您的体系结构/JVM)。
发布于 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和状态标志,如对象当前是否可访问、当前是否同步锁定等。
https://stackoverflow.com/questions/12193116
复制相似问题