我们怎样才能找出java对象的大小?
示例:
class Person{
String name;
int age;
public Person(String n, int a){
name = n;
age = a;
}
}
Person person = new Person("Andy", 30);
现在怎样才能知道人物对象的大小?
谢谢
答案 0 :(得分:9)
这个问题没有意义,至少没有进一步的背景。
Java中“大小”的概念只能在原语中得到合理定义:一个字节是8位(不出所料),int
是32位,long
64位等等(参见例如http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html获取完整列表。)
对于对象实例,它更复杂,因为:
java.lang.String
的实习,请参阅http://en.wikipedia.org/wiki/String_interning)。因此,如果使用大小为y的x对象,则总大小可能小于x * y 也许您可以解释为什么您对对象大小感兴趣。
估计实例使用的堆内存有一些经验法则(例如,在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
它仍然只是一个近似值......
答案 1 :(得分:2)
我认为如果你做这样的话,你可以得到一些可能对你有用的东西:
/* First trigger classloading */
MyObject delegate = new MyObject();
Runtime.getRuntime().gc();
long before = Runtime.getRuntime().freeMemory();
MyObject delegate2 = new MyObject();
long after = Runtime.getRuntime().freeMemory();
System.out.println("Memory used:"+(before-after));
这有望为您提供您想要的答案,或者至少是近似值。
答案 2 :(得分:1)
EhCache提供了一个SizeOf类,它将尝试使用Instrumentation代理,如果代理未加载或无法加载(details here),它将回退到另一种方法。
答案 3 :(得分:1)
您可以使用sizeof4j库来计算Java中任何对象的大小,例如SizeOf.shallowSize(new Integer(2))
答案 4 :(得分:0)
对象。要确定对象的内存使用情况,我们添加金额 每个实例变量使用的内存与相关的开销 每个对象,通常为16个字节。开销包括a 引用对象的类,垃圾收集信息和 同步信息。此外,通常使用内存 填充为8字节的倍数(机器字,64位 机)。例如,Integer对象使用24个字节(16个字节) 开销,其int实例变量为4个字节,以及4个字节 填充)
参考:http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X
答案 5 :(得分:-3)
Java没有内置sizeof
运算符。
您可以尝试使用序列化方法,通过将对象序列化到内存并获取该数据的大小,但这不一定是您想要的大小。
您还可以使用名为sizeOf()
的方法,如下所示:
// returns the size of this object in bytes
int sizeOf()
{
int size = 0;
size += name.Length * 2; // each character in name is 2 bytes, no?
size += 4; // for n, which is 32 bits = 4 bytes
}
请注意,此实现不包含名称中的元数据,只包含为其char[]
生成所需的字节数。