一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?
为一个对象分配了多少内存? 添加属性时使用了多少额外空间?
一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?
为一个对象分配了多少内存? 添加属性时使用了多少额外空间?
当前回答
一个拥有100个属性的对象所消耗的内存空间是否与100个对象各有一个属性所消耗的内存空间相同?
No.
为一个对象分配了多少内存?
32位的开销是8字节,64位的是12字节;然后四舍五入为4字节(32位)或8字节(64位)的倍数。
添加属性时使用了多少额外空间?
属性范围从1字节(byte)到8字节(long/double),但引用是4字节还是8字节,这并不取决于它是32位还是64位,而是取决于-Xmx是否< 32Gb或>= 32Gb:典型的64位JVM有一个名为“-UseCompressedOops”的优化,如果堆低于32Gb,它会将引用压缩到4字节。
其他回答
不,注册一个对象也会占用一些内存。100个具有1个属性的对象将占用更多内存。
不,100个小对象比一个大对象需要更多的信息(内存)。
关于占用多少内存的规则取决于JVM实现和CPU架构(例如32位和64位)。
关于SUN JVM的详细规则,请查看我的旧博客
问候 马克
在32位系统上,每个对象的开销似乎是16字节(在64位系统上是24字节)。
http://algs4.cs.princeton.edu/14analysis/是一个很好的信息来源。下面是一个很好的例子。
http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf的信息也非常丰富,例如:
这将是一个非常广泛的问题。
它取决于类变量,或者你可以在java中调用作为状态的内存使用。
对于头文件和引用,它还需要一些额外的内存。
Java对象使用的堆内存包括
基本字段的内存,根据它们的大小(参见下面的基本类型的大小); 用于引用字段的内存(每个4字节); 一个对象头,由几个字节的“管理”信息组成;
java中的对象还需要一些“内务”信息,比如记录对象的类、ID和状态标志,比如对象当前是否可达、当前是否同步锁定等。
Java对象头大小在32位和64位jvm上不同。
虽然这些是主要的内存消费者,jvm有时也需要额外的字段,如代码的对齐等。
基本类型的大小
布尔和字节——1
Char & short——2
Int & float—4
长双——8