java中对象的大小是多少

时间:2012-05-11 10:07:43

标签: java oop

众所周知,java使用以下数据类型

byte    Occupy 8 bits in memory
short   Occupy 16 bits in memory
int     Occupy 32 bits in memory
long    Occupy 64 bits in memory 

如果我创建一个类似

的类
class Demo{
    byte b;        
    int i;
    long l;
}

Demo obj = new Demo();

现在我的问题是obj尺寸为< or > or =b+i+l的尺寸为104 bytes。请以正当理由给我澄清。

谢谢,
Anil Kumar C

5 个答案:

答案 0 :(得分:7)

来自http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

  
      
  1. 裸对象占用8个字节;
  2.   
  3. 具有单个布尔字段的类的实例占用16个字节:标头的8个字节,布尔的1个字节和7个字节的字节   “填充”使大小达到8的倍数;
  4.   
  5. 具有八个布尔字段的实例也将占用16个字节:标题为8,布尔值为8;因为这已经是一个倍数   8,不需要填充;
  6.   
  7. 具有两个长字段,三个int字段和一个布尔值的对象将占用:   
        
    • 标头的8个字节;
    •   
    • 2个长的16个字节(每个8个);
    •   
    • 3个整数的12个字节(每个4个);
    •   
    • 布尔值为1个字节;
    •   
    • 另外3个字节的填充,将总数从37增加到40,是8的倍数。
    •   
  8.   

答案 1 :(得分:3)

对象的内存大小取决于体系结构,主要取决于VM是32位还是64位。实际的VM实现也很重要。

对于每个对象,您需要空间用于其对象标头(通常在64位VM上为2 * 8个字节),其字段(用于对齐的额外空间取决于VM实现)。然后将最终空格四舍五入到最接近的字数倍。

答案 2 :(得分:2)

很难说将是内存中obj的大小,类型大小指示有助于开发人员,但实际上在内存中它有点不同。我建议你阅读this article,这真的很有趣。

答案 3 :(得分:1)

首先,你混淆了比特和字节。

其次,它还需要指向“vtable”的指针,其中存储有关其类的信息。它很可能是32位系统上的4个字节(32位)和64位系统上的8个字节。

最后,请注意,由于内存碎片,程序总内存可能高于所有对象的总和。

答案 4 :(得分:0)

对象的标头可以在32位JVM上占用8个字节,在32位JVM上占用12个字节。

每个原语取位数(不是你指定的字节数)

对象分配是8字节对齐的,因此在对象的末尾最多有7个字节的填充。即实际使用的空间向上舍入到下一个8的倍数。

class Demo{ // 8 or 12 bytes
    byte b; // 1 byte
    int i;  // 4 bytes
    long l; // 8 bytes
}

Demo obj = new Demo();

因此,对象的大小可以在32位JVM上占用24个字节,在64位JVM上占用32个字节。