一个对象到底占多大内存_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 一个对象到底占多大内存

一个对象到底占多大内存

 2014/9/12 0:57:24  zhenglq  程序员俱乐部  我要评论(0)
  • 摘要:最近在做一个小项目,需要把所有数据刷到内存中,避免采用redis或者其他内存数据库需要多次IO,数据大约9万条,因此要估计下大概需要耗费多少内存,以评估可以在server上部署多少个应用,突然有点懵,期初都是通过Runtime.totalMemory-Runtime.freeMemory来计算,但是这样似乎并不是很好,下面我们来分析分析一个对象到底占用多少内存。先看一个表:类型未压缩(字节)压缩(字节
  • 标签:一个 内存
      最近在做一个小项目,需要把所有数据刷到内存中,避免采用redis或者其他内存数据库需要多次IO,数据大约9万条,因此要估计下大概需要耗费多少内存,以评估可以在server上部署多少个应用,突然有点懵,期初都是通过Runtime.totalMemory-Runtime.freeMemory来计算,但是这样似乎并不是很好,下面我们来分析分析一个对象到底占用多少内存。
     先看一个表:
类型         未压缩(字节)压缩(字节)     boolean   11byte          11short                           22char                            22int                               44float                            44long                            88double    88 reference 84数组 2416
以上数据受到jvm参数压缩未压缩(UseCompressedOops)设定影响,这是基础。

我们再来看看Java对象的内存布局:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),对于padding,是因为占用字节数必须是8的倍数,你可以简单认为是凑数,因为因此内存占用也要从这几方面考虑。比如我们有一个类
class="java" name="code">
class A{
    int a;
}

头对象未压缩是16字节,压缩是12字节,因此:
     未压缩:16(头对象)+4(a)+4(padding)=24字节
         压缩:12(头对象)+4(a)=16字节
再看如下代码
class A{
    int a;
    Integer b;
}


因为 b是对象的引用,需要占用8个字节,因此
      未压缩:16(头对象)+4(a)+8(b)+4(padding)=32字节
         压缩:12(头对象)+4(a)+8(b)=24字节

       我们再分析下数组,数组是个特殊的对象,64位机器上,数组对象的对象头占用24个字节,启用压缩之后占用16个字节。之所以比普通对象占用内存多是因为需要额外的空间存储数组的长度。
        比如 Integer[0],长度为0,只有头对象,因此是24或者16
        再比如Integer[3]
              未压缩:24+8*3=28
                 压缩:16+4*3+4(padding)=32,你也应该知道Integer[4]在压缩下还是32
       最后再看一段代码:

static class B {
        int a;
        int b;
    }
static class C {
        int ba;
        B[] as = new B[3];

        C() {
            for (int i = 0; i < as.length; i++) {
                as[i] = new B();
            }
        }
    }


   我们先来看下这个对象的内存结构吧:



未压缩:
     3个B实例:(16(头对象)+4(a)+4(b))*3=72
      数组对象:24(头对象)+8(B引用)*3=48
          C实例:16(头对象)+4(ba)+8(as引用)+4(padding)=32
压缩:
     3个B实例:(12(头对象)+4(a)+4(b)+4(padding))*3=72
      数组对象:16(头对象)+4(B引用)*3+4(padding)=32
          C实例:12(头对象)+4(ba)+4(as引用)+4(padding)=24

因此一个c实例占用空间为:
   未压缩:72+48+32=152
       压缩:72+32+24=128

     这就是对象占用空间的分析过程。

当然了,现实中,我们不可能去一个一个对象分析内存占用情况,那么代码如何实现呢,我们可以参考这篇博客:
   http://brandnewuser.iteye.com/blog/2113828

此片博客是借鉴别人博客以及我个人理解,欢迎大家拍砖。
借鉴博客位置:http://www.cnblogs.com/magialmoon/p/3757767.html


  
  • 大小: 31 KB
  • 查看图片附件
上一篇: java 内存运行机制 下一篇: 没有下一篇了!
发表评论
用户名: 匿名