Java Memory 测试

by Roger (roger2yi@gmail.com, http://www.twitter.com/roger2yi )

这个Java Memory的测试,目的在于研究基本对象(空对象,引用,数组,字串)的内存开销和内存分配与布局,原理和测试代码参考自(http://www.javaworld.com/javaworld/javatips/jw-javatip130.html?page=1),并扩展到其它平台特别是手机平台进行测试,从已有的数据来看:

  1. JDK32bits 的空对象为8个bytes,引用是4个bytes,内存分配是8取整,成员变量地址不需要对齐
  2. JDK64bits 的空对象为16个bytes(实际是12个bytes,被取整到16个bytes),引用是4个bytes,内存分配是8取整,成员变量地址不需要对齐
  3. Sun的WTK J2ME模拟器的数据比较奇怪,跟下面的M8手机上kJVM的结果相差较远,存在变量地址需要4对齐的现象,因为kJVM的实现有很多,所以可能各个不同实现的结果差别会比较大
  4. 在M8手机上一个移植的kJVM上的结果是空对象为4个bytes,引用是4个bytes,内存分配是4取整,成员变量地址不需要对齐
  5. 在三星5230上的kJVM的测试结果跟上面一样,看来模拟器的数据不具备真实的参考意义,实际的kJVM实现在内存耗费上针对kJVM只支持有限的内存空间做了专门优化,对象的内存占用比较小
  6. 在Android 2.3/3.0 模拟器和一个M8手机的移植Android2.1系统,还有联想的乐Phone上的Android2.2上测试结果是空对象为16个bytes!!!引用是4个bytes,内存分配是8取整,成员变量地址必需4对齐,这意味着一个byte成员变量也要占用4个bytes的空间(看来Android无论模拟器还是手机基本上都是同一套虚拟机源码,测试结果都一样)
  7. 黑莓手机模拟器的数据也比较奇怪,无法作为参考

完整的数据在下面的这份Excel文档,可以自行下载测试程序(包含源代码)在其它kJVM如Nokia S40,索爱等支持kJava的手机,或者Android和黑莓手机上进行测试,如能把结果告知(在原文档中增加一栏数据并寄回给我即可),将不胜感激。

数据:http://pluto-hades.googlecode.com/files/JavaMemory.xls

GoogleDoc:https://spreadsheets.google.com/pub?hl=zh_CN&hl=zh_CN&key=0AjfzaZDib9_8dDdsWTV1ZGlqOGlFODF4czVMRldKMUE&output=html

程序包(含源码):http://pluto-hades.googlecode.com/files/JavaMemory.zip

部分数据截图:

Advertisements