锁定老帖子 主题:深入Java对象大小
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-13
mercyblitz 写道 swordice 写道 感谢LZ,最近正好要用这方面的东西
欢迎指正哦。 ![]() 我还有有个问题,虚拟机会不会对对象进行内存对齐? 因为最近看HBase的源代码时发现在进行类对象大小计算时进行了内存对齐,对此表示疑惑 另外,LZ的测试环境是在32位还是64位的环境下进行的?两者的结果会不会不一样? 谢啦 ![]() |
|
返回顶楼 | |
发表时间:2010-07-13
swordice 写道 mercyblitz 写道 swordice 写道 感谢LZ,最近正好要用这方面的东西
欢迎指正哦。 ![]() 我还有有个问题,虚拟机会不会对对象进行内存对齐? 因为最近看HBase的源代码时发现在进行类对象大小计算时进行了内存对齐,对此表示疑惑 另外,LZ的测试环境是在32位还是64位的环境下进行的?两者的结果会不会不一样? 谢啦 ![]() 通过Profile的,不会发生的。 我文章说明是x86下面(可能造成了误会,x86= 32位,x64=64位)。 在64位系统中,我做过测试,Object的大小是16字节。翻了一倍。在JDK7中对象会被压缩,具体我没有测试过。 |
|
返回顶楼 | |
发表时间:2010-07-13
lz 研究精神可嘉,,评精华
|
|
返回顶楼 | |
发表时间:2010-07-13
java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。
如果你只是问JVM中一个 new object的大小,其实我也不知道 |
|
返回顶楼 | |
发表时间:2010-07-13
beneo 写道 java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。
如果你只是问JVM中一个 new object的大小,其实我也不知道 可以计算的,只是在x86和x64上面有不同而已,不然Profile工具就是失去了意义。 从JVM实现的角度,统一了对象大小。 |
|
返回顶楼 | |
发表时间:2010-07-13
mercyblitz 写道 beneo 写道 java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。
如果你只是问JVM中一个 new object的大小,其实我也不知道 可以计算的,只是在x86和x64上面有不同而已,不然Profile工具就是失去了意义。 从JVM实现的角度,统一了对象大小。 我没说清楚 你这个是用jprofile计算出来的,如果你那IBM VM看的话,可能就不一样。再次不同的VM版本,对象的大小也不一样。 我们在日常使用过程中,我自己只能估算一下,开多少数组,耗费多少内存。那究竟包含数组的对象耗费多少heap,你是不能计算出来的,除非拿jprofile等工具去实际测。 |
|
返回顶楼 | |
发表时间:2010-07-13
beneo 写道 mercyblitz 写道 beneo 写道 java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。
如果你只是问JVM中一个 new object的大小,其实我也不知道 可以计算的,只是在x86和x64上面有不同而已,不然Profile工具就是失去了意义。 从JVM实现的角度,统一了对象大小。 我没说清楚 你这个是用jprofile计算出来的,如果你那IBM VM看的话,可能就不一样。再次不同的VM版本,对象的大小也不一样。 我们在日常使用过程中,我自己只能估算一下,开多少数组,耗费多少内存。那究竟包含数组的对象耗费多少heap,你是不能计算出来的,除非拿jprofile等工具去实际测。 对于不同的JVM的实现,这个没有关系,最多是多测试而已。 |
|
返回顶楼 | |
发表时间:2010-07-13
其实在32位HotSpot里java.lang.Integer和java.lang.Long的大小就是一样的啊……
原因是32位HotSpot的对象分配是8字节对齐的。当对象自身所需数据占不足8字节的倍数的时候就会在一些位置加上padding。“一些位置”一般是整个对象的末尾,也可能是在中间。 HotSpot是按成员类型来计算对象布局的。可以读一下这篇,讲得还不错:Java Objects Memory Structure (看不到的话请自行想办法翻……) 这帖讲的内容适用于32位HotSpot。其它JVM则有各自不同的对象布局方式。例如说早期的Sun JVM(后来叫Classic VM)采用的对象布局就跟HotSpot的完全不同,而像SableVM采用的对象布局则相当有特色。JVM规范并没有对对象布局做定义——JVM实现可以用自己喜欢的方式来做。 要靠谱的Java对象大小数据,可以参考这帖使用JVMTI来获取:Again about determining size of Java object VisualVM也是通过JVMTI来获取对象大小、数量等的信息。 以前我也发过一帖是拿32位HotSpot的对象布局来玩的,[标题党] 跑得好好的C#程序咋移植为Java就不够内存用了呢?——忽悠一把 |
|
返回顶楼 | |
发表时间:2010-07-13
最后修改:2010-07-13
well……有同学想自己计算HotSpot里Java对象的布局的话,请参考HotSpot自身所使用的逻辑:
hotspot/src/share/vm/classfile/classFileParser.cpp 找这个方法: ClassFileParser::parseClassFile(),看2833行开始: // Field size and offset computation 对象布局的计算就在里面,包括instanceKlass自身的布局(包含有Java类的静态变量)和Java对象实例的布局都在这里算。 |
|
返回顶楼 | |
发表时间:2010-07-13
RednaxelaFX 写道 well……有有同学想自己计算HotSpot里Java对象的布局的话,请参考HotSpot自身所使用的逻辑:
hotspot/src/share/vm/classfile/classFileParser.cpp 找这个方法: ClassFileParser::parseClassFile(),看2833行开始: // Field size and offset computation 对象布局的计算就在里面,包括instanceKlass自身的布局(包含有Java类的静态变量)和Java对象实例的布局都在这里算。 谢谢,尽管我没有过(最近也在研究JVM实现),但是我比较偏好HotSpot的实现。不过我打算再写一篇计算篇,通过反向推到出来。 |
|
返回顶楼 | |