实现一个sizeof获取java对象大小

实现一个sizeof获取java对象大小

ID:9245030

大小:40.50 KB

页数:11页

时间:2018-04-25

实现一个sizeof获取java对象大小_第1页
实现一个sizeof获取java对象大小_第2页
实现一个sizeof获取java对象大小_第3页
实现一个sizeof获取java对象大小_第4页
实现一个sizeof获取java对象大小_第5页
资源描述:

《实现一个sizeof获取java对象大小》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、实现一个sizeof获取Java对象大小  在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;  由于Java的设计者不想让程序员管理和了解内存的使用,我们想要知道一个对象在内存中的大小变得比较困难了。本文提供了可以获取对象的大小的方法,但是由于各个虚拟机在内存使用上可能存在不同,因此该方法不能在各虚拟机上都适用,而是仅在hotspot32位虚拟机上,或者其它内存管理方式与hotspot32位虚拟机相同的虚拟机上适用。  本方法使用了Unsafe类来

2、访问对象的私有属性,因此有些特殊的设置和做法,要留意类定义前面的文字说明。  要想计算对象大小,我们必须熟悉hotspot32上不同类型所占的空间:  一,原始类型primitives:  boolean:1byte,尽管Java语言规范里面boolean是一个bit;  byte:1byte;  char:2bytes;  short:2bytes;  int:4bytes;  float:4bytes;  long:8bytes;  double:8bytes。  二,引用类型:  4bytes,即使是null值也是如此。  三,空的普通对象(无任

3、何属性,如newObject(),不是null对象):  8bytes。存放对象头的各种信息。  四,空的数组(即长度为0的数组,而不是null数组):  12bytes,其中比普通对象多出来的4bytes是用来放数组长度的。  五,hotspot32分配内存是以8bytes的整数倍来计算的,因此不足8个字节的对象要补足剩余的  字节数以对齐。  Java代码  /**  *这个例子在eclipse里不能直接编译,要到项目的属性,  *JavaCompiler,Errors/Warnings中DeprecatedandrestrictedAPI  *中

4、Forbiddenreference(accessrules)中设置为warning。  *  *获取一个Java对象在内存所占的空间,不同的虚拟机内存管理方式可能不同,  *本例是针对32位的hotspot虚拟机的。  *  *由于虚拟机对字符串做了特殊处理,比如将其放入常量池,因此sizeof得到的字符串  *包含了常量池里面占用的空间。基本类型的包装类也会重复利用对象。  *  *设计作者:teasp  *信息描述:  */  @SuppressWarnings("restriction")  publicclassHotspotSizeof  

5、{  publicstaticfinalintOBJ_BASIC_LEN=8*8;  publicstaticfinalintARRAY_BASIC_LEN=12*8;  publicstaticfinalintOBJ_REF_LEN=4*8;  publicstaticfinalintALIGN=8*8;  privatestaticUnsafeUNSAFE;  static{  try  {  FieldtheUnsafe=Unsafe.class.getDeclaredField("theUnsafe");  theUnsafe.setAcces

6、sible(true);  UNSAFE=(Unsafe)theUnsafe.get(null);  }  catch(Exceptione)  {  e.printStackTrace();  }  }  /**  *原始类型的种类,以及每个类型所占空间,单位为bit  *@authorAdministrator  *  */  privateenumPType  {  布尔(8)/*Java语言规定是1个bit*/,字节(8),字符(16),短整(16),  整形(32),浮点(32),长整(64),双精(64);  privateintbits;

7、  privatePType(intbits)  {  this.bits=bits;  }  publicintgetBits(){  returnbits;  }  }  /**  *计算obj对象在虚拟机中所占的内存,单位为bit。  *如果isPapa为true,则表明计算的是obj对象父类定义的属性。  *  *@paramobj  *@paramclazz  *@paramisPapa  *@return  */  privatestaticintgetObjBits(Objectobj,Classclazz,booleanisPapa) 

8、 {  intbits=0;  if(obj==null)  {  returnbits;  

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。