sizeof java对象

时间:2010-11-06 21:23:57

标签: 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);  

现在怎样才能知道人物对象的大小?

谢谢

6 个答案:

答案 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
  • 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

它仍然只是一个近似值......

答案 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),它将回退到另一种方法。

另见the agent from Heinz Kabutz

答案 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[]生成所需的字节数。