新建一个对象怎样计算它用了多少内存?
  域成员的空间?静态块里的内容?构造方法里的内容?
  请指教了

解决方案 »

  1.   

    .... ....个人感觉很难。jvm中每个对象都不是独立存在的,无法像c中那样得到每个struct的大小。
      

  2.   

    空对象占8个字节
    有数据成员的话,你把数据成员按基本数据类型和对象引用分开统计。
    基本数据类型按byte/boolean=1,char/short=2,int/float=4,long/double=8,累加,然后对齐到8的倍数。对象引用按每个4字节,累加,然后对齐到8个字节的倍数。
    对象占用字节数=基本的8字节+基本数据类型所占的+对象引用所占的
    比如:
    class A{
        int a;
        char b;
    }
    占 8(基本)+8(int 4+char 2=6,对齐到8)= 16个字节
    再比如:
    class B{
        Integer a;
        long b;
        byte c;
    }
    占 8(基本)+8(long4+byte1=5,对齐到8)+8(对象引用4,对齐到8)=32个字节
    如果你是从别的类继承的,父类的也要算上。
      

  3.   

    你可以new两个对象,放到栈里同,在debug下得到两个对象在内存中的地址,然后相减就可以了
      

  4.   

    基本是没法得到的不同的jvm实现对方法区以及对象的表现形式都是自己定义的,jvm spec没有做特别的规定再者,每个对象和类都有一个锁信息,有的jvm实现在new对象的时候就分配内存,有的jvm实现在用到锁的时候才分配锁所占的内存对于不同的gc实现,也可能在对象中增加一些信息
    所以这个内存的占用是得不到的,也是没必要的
      

  5.   

    这个纯属扯淡,jvm中boolean是用int来表示的,java对象可以用c的结构体来表示,但也用其他方式来表示
      

  6.   

    呃,楼主为什么需要知道对象的大小呢?个人觉得,我们应该做的是学习如何写优质的代码去利用好内存空间和避免内存溢出,甚至可以是GC算法的调优、虚拟机的内存分配调优等等,我觉得太底层的技术和实现不是Java的优势和重心所在。
    JVM规范没有限定对象在内存中的表示形式的,堆、栈、和方法区都没有限定的实现形式,不同的JVM不同。
      

  7.   

    是不是和NEW 的对象大小也有关呢??????请教
      

  8.   

    不同的jvm实现可以有不同的存储方法,jvm规范没有定义
      

  9.   

    JVM控制了程序员访问系统内存的入口,基本无法统计java对象所占内存大小。
    6L的说的C/C++的策略,java不适合
      

  10.   

    使用 Java 5 后新增的 Instrumentation
    Instrumentation: querying the memory usage of a Java object
      

  11.   

    new出来的空间在堆内存中,用完就回收的