大家都知道,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
。 请给我澄清正当理由。
谢谢,
阿尼尔·库马尔Ç
对象的内存大小取决于体系结构,主要是对VM是32位或64位。 实际的虚拟机实现也很重要。
对于每个对象,则需要空间为它的对象头(通常为2 * 8个字节在64位的虚拟机),它的字段(取决于VM实现用于对准额外的空间)。 那么最终的空间向上取整到字大小最接近的倍数。
从http://www.javamex.com/tutorials/memory/object_memory_usage.shtml
- 裸对象占用8个字节;
- 一类具有单个布尔型字段的实例占用16个字节:8个字节首标,为布尔1个字节和7个字节“填充”以使该尺寸可达8的倍数的;
- 具有八个布尔字段的实例也将占用16个字节:8用于报头,8为布尔值; 因为这已经是8的倍数,则无需填充;
- 有两个长田,三个int字段和一个布尔对象会占用:
- 8个字节用于报头;
- 16个字节用于2个多头(8个);
- 12个字节用于3个int(4各自);
- 1个字节为布尔;
- 另外3个字节的填充,舍从37至40的总起来,为8的倍数。
很难说,这将是在内存中obj的大小,类型大小指示帮助开发者,但实际上在内存这是一个有点不同。 我建议你阅读这篇文章 ,这真的很有趣。
首先,你糊涂比特和字节。
其次,它也需要指针“虚表”,其中存储了关于其类的信息。 它将,最可能是32位系统的4个字节(32位)和在64位sytems 8个字节。
最后,需要注意的是,由于内存碎片,总程序存储器可能比所有对象的总和高。
一个对象的头部可以采取32位JVM上的32位JVM 8个字节和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();
因此,对象的大小可以取一个64位JVM上的32位JVM 24个字节和32个字节。