我们怎样才能知道Java对象的大小呢?
Example:
class Person{
String name;
int age;
public Person(String n, int a){
name = n;
age = a;
}
}
Person person = new Person("Andy", 30);
我怎样才能知道人物对象的大小?
这个问题没有意义,至少没有进一步的背景。
Java 中“大小”的概念仅针对原语进行了相当明确的定义:一个字节是 8 位(毫不奇怪)int
是 32 位,一个long
64位等(参见例如http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html以获得完整列表)。
对于对象实例,情况更加复杂,因为:
- 对象实例可以(并且通常会)在内部包含对其他实例的引用,因此您必须决定是否对这些依赖实例进行计数以及如何计数。如果多个实例共享依赖项怎么办?
- 有时,对象实例可以被重用(例如,实习
java.lang.String
, see http://en.wikipedia.org/wiki/String_interning http://en.wikipedia.org/wiki/String_interning)。因此,如果您使用 x 个大小为 y 的对象,则总大小可能小于 x*y
- JVM 对于如何在内部实现对象和实例有很大的余地。
它可能对不同的实例使用不同的技术(例如共享内部数据结构),因此甚至可能没有有意义的“大小”来分配给单个对象。
也许你可以解释一下为什么你对物体的大小感兴趣。
有一些经验法则可用于估计实例使用的堆内存(例如,在 Sun JVM 中,java.lang.Object
实例使用 8 个字节),但这些取决于您使用的 JVM。
一般来说,如果您想了解堆使用情况,请使用内存/堆分析器。
Edit:
好吧,(从 JDK 6 开始)有一种方法可以获取对象使用的内存量的近似值:http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29 http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29
这仍然只是一个近似值...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)