[资料] Java如何获知对象大小?

deyimsf 2013-01-30
如果不用工具dump内存,在Java中有没有在程序中获取某个对象的大小的方法?
比如如何获得某个对象的实际大小,还有这个对象所引用的其他对象的大小?
RednaxelaFX 2013-01-30
有老帖提过这个:
http://hllvm.group.iteye.com/group/topic/26051
这里有详细用法:http://www.jroller.com/maxim/entry/again_about_determining_size_of
基本原理就是利用Java agent可以使用的Instrumentation API里java.lang.instrument.Instrumentation.getObjectSize(Object)来获取单个对象的大小;如果需要知道以它为根的对象图的大小则自己用反射遍历对象里的字段即可。
deyimsf 2013-07-11
RednaxelaFX 写道
有老帖提过这个:
http://hllvm.group.iteye.com/group/topic/26051
这里有详细用法:http://www.jroller.com/maxim/entry/again_about_determining_size_of
基本原理就是利用Java agent可以使用的Instrumentation API里java.lang.instrument.Instrumentation.getObjectSize(Object)来获取单个对象的大小;如果需要知道以它为根的对象图的大小则自己用反射遍历对象里的字段即可。




jvm版本:
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)

public static void main(String[] args){  
        Instrumentation inst = SizeOfObject.inst;  
       String a = new String("ab");
       String b = new String("abedefghijkfied发大水桂丰大厦gre外国人fikfeikdslfiejfkldjsgaiejfedwiao;feiwjafewia;feiowajfeoiw;jfdjsklafjkdshakflie中国ffffffff");

       System.out.println(inst.getObjectSize(a));
       System.out.println(inst.getObjectSize(b));
    }  

输出结果:
24
24

我用上面的代码来测试字符对象的大小,和我理解的不一样,为什么不是字符串的大小呢?
RednaxelaFX 2013-07-11
我已经写过很多次关于HotSpot VM里java.lang.String的大小问题了。
请参考这里:http://rednaxelafx.iteye.com/blog/730461 中后部分
和这里:http://www.valleytalk.org/2011/07/28/java-%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%BC%96%E8%AF%91%EF%BC%8C%E5%8A%A0%E8%BD%BD-%E5%92%8C-%E6%89%A7%E8%A1%8C/

关键在于java.lang.String对象自身并不包含字符串内容,而是引用着一个char[],让后者持有字符串真正的字符内容。就跟java.util.ArrayList对象并不包含列表内容,而是引用着一个java.lang.Object[]来持有真正的列表元素一样。

java.lang.instrument.Instrumentation.getObjectSize()返回的是给定的对象自身的大小,不包括其成员字段所引用的别的对象的大小。在您的测试代码里,它就总是返回java.lang.String实例自身的大小而不包括其引用的char[]的大小。
Global site tag (gtag.js) - Google Analytics