Java 对象大小的计算

                          Java对象的大小

如何计算一个对象的大小呢?


    正常情况下,对象是分配在堆上。 然而,有些对象并不是分配在堆上。 如small thread-local 对象被分配在栈上或者寄存器中。 还有当前对象的状态也影响对象的大小。比如对象是否占用锁 或者 对象正在垃圾回收中。本章中讨论的是一般意义上的Java对象的大小。

1. 计算对象大小的规则
   1.1 在Hotspot中,对象主要包括三部分:

    对象头:

    基本类型 :
   
    对象引用类型 :占用四个字节
   
    padding : 浪费的空间  便于对象的分配

   1.2 基本类型的大小
      
       boolean 1字节
       byte    1字节

       char    2字节
       short   2字节
      
       int     4字节
       float   4字节

       long    8字节
       double  8字节

   1.3 对象头的大小
       记录一个对象的类 ID 和状态 (比如这个对象是否可达  锁状态) 。在Hopspot中, 正常的对象占头部需要占用8个字节。 数组占用12个字节(四个字节是数组的长度). 其它VM中都有相似的对象的头部。
  
   1.4 对象的大小
   Hotspot中,对象的大小必须是8的倍数。这意味着 :

   一个空对象占用8个字节
   一个仅有一个boolean值的对象 占用16个字节(8 + 1 + 7 )
   一个有8个boolean值的对象,也占用16个字节。(no padding)
  
   下一章介绍数组的大小。数组是是一种特殊的对象。在Java中,多维数组是数组的数组。例如二维数组,每一行都是独立的数组对象。
   
   boolean 数组需要每个元素都占用一个字节。尽管每一个字节都存储1Bit。 如果存储大量的位信息,可以使用BitSet。

在C语言中,二位数组是(或者任何多维数组)实际上一维数组。而在Java中,每个多维数组实际上一组内嵌数组。

考虑10*10的整型数组,out Array :12(头部) + 4 * 10 (指向10个一维数组的引用) + 4 (Padding ) = 56 个字节 

10个子数组 占用 (12 + 10 *4 + 4(Padding)) * 10 。 整个二维数组占用11 * 56 = 616个字节。 然而对于100个整型来说 ,只占用 4 * 10 * 10  = 400
  

   
      


   

猜你喜欢

转载自e200702084.iteye.com/blog/2228350
今日推荐