5

众所周知,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();

现在我的问题是objsize< or > or =的大小b+i+l104 bytes. 请给我一个有正当理由的澄清。

谢谢,
阿尼尔库马尔 C

4

5 回答 5

6

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

  1. 一个裸 Object 占用 8 个字节;
  2. 具有单个布尔字段的类的实例占用 16 个字节:8 个字节的标头,1 个字节的布尔值和 7 个字节的“填充”,以使大小达到 8 的倍数;
  3. 具有 8 个布尔字段的实例也将占用 16 个字节:8 个用于标头,8 个用于布尔值;因为这已经是 8 的倍数,所以不需要填充;
  4. 具有两个长字段、三个 int 字段和一个布尔值的对象将占用:
    • 8个字节的头部;
    • 16 个字节用于 2 个 long(每个 8 个);
    • 3 个整数 12 个字节(每个 4 个);
    • 布尔值 1 个字节;
    • 另外 3 个字节的填充,将总数从 37 向上舍入到 40,即 8 的倍数。
于 2012-05-11T10:13:35.400 回答
4

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

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

于 2012-05-11T10:14:49.367 回答
2

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

于 2012-05-11T10:15:27.830 回答
1

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

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

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

于 2012-05-11T10:17:23.500 回答
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 个字节。

于 2012-05-11T11:55:44.437 回答