Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中对象的大小是多少_Java_Oop - Fatal编程技术网

java中对象的大小是多少

java中对象的大小是多少,java,oop,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(); 现在我的问题是o

众所周知,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
大小是
还是=
的大小是
b+i+l
,即
104字节。请给我一个合理的解释

谢谢,
阿尼尔·库马尔来自

  • 一个裸对象占用8字节
  • 具有单个布尔字段的类的实例占用16个字节:8个字节的头、1个字节的布尔字段和7个字节的 “填充”使大小达到8的倍数
  • 具有八个布尔字段的实例也将占用16个字节:8个用于头,8个用于布尔;因为这已经是一个多重的 8,无需填充
  • 具有两个长字段、三个整型字段和一个布尔值的对象将占用:
    • 报头为8字节
    • 2个长字节16个字节(每个8个)
    • 3个整数的12个字节(每个4个)
    • 布尔值为1字节
    • 再加上3个字节的填充,将总数从37四舍五入到40,是8的倍数

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


    对于每个对象,您需要为其对象头(在64位虚拟机上通常为2*8字节)及其字段(根据虚拟机实现,需要额外的对齐空间)留出空间。最后的空格被四舍五入到单词大小的最近倍数。

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

    首先,你混淆了位和字节

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


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

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

    每个原语都采用位数(不是您指定的字节)

    对象分配是8字节对齐的,因此在对象末尾最多有7字节的填充。i、 e.实际使用的空间被四舍五入到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字节。

    当今愚蠢的问题:那么方法引用呢?它们是否在对象中?如果是这样,对于每个方法,我们应该增加其引用的大小。@BigMike:通常,方法引用是类对象的一部分,而不是实例化的对象。当然,基于热点的虚拟机在空闲时可以自由地将事情复杂化……因此基本上,至少对虚拟表的引用(我可以使用这个术语吗?)必须总结为对象大小,或者虚拟机是否保持完全分离的对象实例和类在我的句子中使用不当的类-@BigMike:IIRC,每个对象的头的一部分是对其相应类对象的引用。每个新实例的方法引用都不会重复…对象分配在32位和64位JVM中是8字节对齐的。+1我只是想知道方法引用是如何发挥作用的。看看它将帮助您大致测量对象的大小。插装有何帮助?请参阅了解如何在中计算对象的大小请记住,您可以看看这个:[几乎相同的问题][1][1]:它包含用于估计对象大小的方法getObjectSize。下面是一个用法示例:
    一个对象的头在32位JVM上可以占用8个字节,在32位JVM上可以占用12个字节
    那么有什么区别呢?这比人们所接受的答案更准确。