论坛首页 Java企业应用论坛

深入Java对象大小

浏览 19889 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-07-13  
mercyblitz 写道
swordice 写道
感谢LZ,最近正好要用这方面的东西


欢迎指正哦。


我还有有个问题,虚拟机会不会对对象进行内存对齐?
因为最近看HBase的源代码时发现在进行类对象大小计算时进行了内存对齐,对此表示疑惑
另外,LZ的测试环境是在32位还是64位的环境下进行的?两者的结果会不会不一样?
谢啦

0 请登录后投票
   发表时间:2010-07-13  
swordice 写道
mercyblitz 写道
swordice 写道
感谢LZ,最近正好要用这方面的东西


欢迎指正哦。


我还有有个问题,虚拟机会不会对对象进行内存对齐?
因为最近看HBase的源代码时发现在进行类对象大小计算时进行了内存对齐,对此表示疑惑
另外,LZ的测试环境是在32位还是64位的环境下进行的?两者的结果会不会不一样?
谢啦




通过Profile的,不会发生的。

我文章说明是x86下面(可能造成了误会,x86= 32位,x64=64位)。

在64位系统中,我做过测试,Object的大小是16字节。翻了一倍。在JDK7中对象会被压缩,具体我没有测试过。
0 请登录后投票
   发表时间:2010-07-13  
lz 研究精神可嘉,,评精华
0 请登录后投票
   发表时间:2010-07-13  
java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。

如果你只是问JVM中一个 new object的大小,其实我也不知道
0 请登录后投票
   发表时间:2010-07-13  
beneo 写道
java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。

如果你只是问JVM中一个 new object的大小,其实我也不知道


可以计算的,只是在x86和x64上面有不同而已,不然Profile工具就是失去了意义。

从JVM实现的角度,统一了对象大小。
0 请登录后投票
   发表时间:2010-07-13  
mercyblitz 写道
beneo 写道
java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。

如果你只是问JVM中一个 new object的大小,其实我也不知道


可以计算的,只是在x86和x64上面有不同而已,不然Profile工具就是失去了意义。

从JVM实现的角度,统一了对象大小。


我没说清楚

你这个是用jprofile计算出来的,如果你那IBM VM看的话,可能就不一样。再次不同的VM版本,对象的大小也不一样。

我们在日常使用过程中,我自己只能估算一下,开多少数组,耗费多少内存。那究竟包含数组的对象耗费多少heap,你是不能计算出来的,除非拿jprofile等工具去实际测。
0 请登录后投票
   发表时间:2010-07-13  
beneo 写道
mercyblitz 写道
beneo 写道
java 对象的大小跟 虚拟机有关系,你自己只能估算,不可能准确。

如果你只是问JVM中一个 new object的大小,其实我也不知道


可以计算的,只是在x86和x64上面有不同而已,不然Profile工具就是失去了意义。

从JVM实现的角度,统一了对象大小。


我没说清楚

你这个是用jprofile计算出来的,如果你那IBM VM看的话,可能就不一样。再次不同的VM版本,对象的大小也不一样。

我们在日常使用过程中,我自己只能估算一下,开多少数组,耗费多少内存。那究竟包含数组的对象耗费多少heap,你是不能计算出来的,除非拿jprofile等工具去实际测。


对于不同的JVM的实现,这个没有关系,最多是多测试而已。
0 请登录后投票
   发表时间: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就不够内存用了呢?——忽悠一把
6 请登录后投票
   发表时间: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对象实例的布局都在这里算。
0 请登录后投票
   发表时间: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的实现。不过我打算再写一篇计算篇,通过反向推到出来。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics