众所周知,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
答案 0 :(得分:7)
来自http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
- 裸对象占用8个字节;
- 具有单个布尔字段的类的实例占用16个字节:标头的8个字节,布尔的1个字节和7个字节的字节 “填充”使大小达到8的倍数;
- 具有八个布尔字段的实例也将占用16个字节:标题为8,布尔值为8;因为这已经是一个倍数 8,不需要填充;
- 具有两个长字段,三个int字段和一个布尔值的对象将占用:
醇>
- 标头的8个字节;
- 2个长的16个字节(每个8个);
- 3个整数的12个字节(每个4个);
- 布尔值为1个字节;
- 另外3个字节的填充,将总数从37增加到40,是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个字节。