【问题标题】:What is the size of the object in javajava中对象的大小是多少
【发布时间】:2012-05-11 10:07:42
【问题描述】:

众所周知,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。请以正当的理由给我澄清。

谢谢,
阿尼尔库马尔C

【问题讨论】:

标签: java oop


【解决方案1】:

来自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 的倍数。

【讨论】:

  • 这比已经接受的答案更准确。
【解决方案2】:

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

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

【讨论】:

  • 当天的愚蠢问题:方法引用呢?它们是否在对象中?如果是这样,对于每个方法,我们应该添加其引用的大小。
  • @BigMike:通常,方法引用是类对象的一部分,而不是实例化对象。当然,基于 HotSpot 的虚拟机可以随意让事情复杂化……
  • 所以基本上至少对虚拟表的引用(我可以使用这个术语吗?)必须总结到对象大小,或者VM是否保持完全分离的对象实例和类? - 我的句子中使用不当的类 -
  • @BigMike:IIRC,每个对象的部分标头是对其对应类对象的引用。对于每个新实例,方法引用重复...
  • 对象分配在 32 位和 64 位 JVM 中是 8 字节对齐的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • +1 我只是想知道方法引用是如何发挥作用的。
    【解决方案5】:

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

    【讨论】:

    • The header of an object can take 8 bytes on a 32-bit JVM and 12 bytes on a 32-bit JVM 那有什么区别呢?
    猜你喜欢
    • 2017-04-24
    • 2015-07-30
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多