java中对象的大小是多少

众所周知,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 size是 or = b+i+l的大小是104 bytes 。 请以正当理由给我澄清。

谢谢,
阿尼尔库马尔

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

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

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

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

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

首先,你混淆了位和字节。

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

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

对象的标头可以在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个字节。

我认为这个答案会让你对对象的大小有深刻的理解。

什么决定了Java对象的大小?