sizeof java对象

我们怎样才能找出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获取完整列表)。

对于对象实例,它更复杂,因为:

  • 对象实例可以(通常会)在内部包含对其他实例的引用,因此您必须决定是否计算这些依赖实例以及如何计算。 如果多个实例共享依赖项怎么办?
  • 有时,可以重用对象实例(例如, 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%

它仍然只是近似…

如果你这样做,我想你可以得到一些可能对你有所帮助的东西:

  /* 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)); 

这有望为您提供您想要的答案,或者至少是近似值。

EhCache提供了一个SizeOf类,它将尝试使用Instrumentation代理,如果代理未加载或无法加载,将返回不同的方法( 详情请参见此处 )。

另请参阅Heinz Kabutz的经纪人 。

您可以使用sizeof4j库来计算java中任何对象的大小,如SizeOf.shallowSize(new Integer(2))

对象。 为了确定对象的内存使用情况,我们将每个实例变量使用的内存量添加到与每个对象关联的开销中,通常为16个字节。 开销包括对对象类的引用,垃圾收集信息和同步信息。 此外,内存使用量通常填充为8字节的倍数(机器字,在64位机器上)。 例如,Integer对象使用24个字节(16个字节的开销,4个字节用于其int实例变量,4个字节的填充)

参考: http : //www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X

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