Java对象的sizeof
我们如何找出Java对象的大小?
例:
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以获得完整列表)。
对于对象实例,它更加复杂,因为:
- 对象实例可以(并且通常会)在内部包含对其他实例的引用,因此您必须决定是否计算这些从属实例,以及如何计算。如果多个实例共享一个依赖关系怎么办?
- 有时,对象实例可能会被重用(例如的Interning
java.lang.String
,请参阅http://en.wikipedia.org/wiki/String_interning)。因此,如果使用大小为y的x个对象,则总大小可能小于x * y - JVM在如何内部实现对象和实例方面有很多余地。它可能对不同的实例使用不同的技术(例如,共享内部数据结构),因此甚至可能没有有意义的“大小”可分配给单个对象。
也许您可以解释为什么对对象大小感兴趣。
估算实例使用的堆内存有一些经验法则(例如,在Sun JVM中,一个java.lang.Object
实例使用8字节),但是这些将取决于您使用的JVM。
通常,如果您想了解堆的使用情况,请使用内存/堆分析器。
编辑:
- 好的,(从JDK
- 6开始)有一种方法可以近似估算对象使用的内存量:http
- //download.oracle.com/javase/6/docs/api/java/lang/instrument/
Instrumentation.html#getObjectSize%28java.lang.Object%29
仍然只是一个近似值…
以上是 Java对象的sizeof 的全部内容, 来源链接: utcz.com/qa/418807.html