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