当Java对象的所有成员都为null时,它会使用多少内存?

假设Java对象只占用对象引用的8个字节是正确的,只要它的所有成员都设置为null或者成员的定义是否因某种原因已经占用了实例中的空间?

换句话说,如果我有一大堆我想要节省空间的对象,我可以依靠将未使用的成员设置为null来减少内存占用吗?

不,对于存储在字段中的每个空值,您需要4个或8个字节(取决于它是32位还是64位系统)。 如果某个地方没有存储的东西告诉它,那么该对象如何知道它的字段为空?

不,null也是信息,也必须存储。

对象引用本身仍将占用一些内存,因此唯一真正的内存节省将来自本来会引用的堆对象。

所以,如果你有

 MyClass { public Object obj; MyClass(Object o) { obj = o; } } MyClass a = new MyClass( new HashMap() ); MyClass b = new MyClass( null ); 

两个对象ab本身占用相同数量的内存(它们都包含一个引用),但是由a引用的Object obj占用堆上的内存,因此可以通过将引用设置为null来保存此内存。

Java语言规范和Java虚拟机规范没有说明内存中Java对象的大小 – 故意保留未定义,因为它取决于JVM的实现。 这意味着您无法对Java对象通常使用的内存量或内存中Java对象的内存布局做出任何假设。

正如其他人已经说过的那样:引用(变量)占用内存,无论引用是否为null 。 将成员变量设置为null时,对象不会缩小并占用更少的内存。

类,对象和方法名称怎么样? 你可以调用,使用Java反映访问或实例化它们,名称也必须存储在某个地方,对吧? 但是CMIIW。

卡格

当Java对象的所有成员都为null时,它将占用内存,因为它还有一些额外的内存需求,用于标题,引用和内务处理。

Java对象使用的堆内存包括

  • 原始字段的内存,根据其大小。

  • 参考字段的内存(每个4字节)。

  • 一个对象头,由几个字节的“管家”信息组成。

java中的对象还需要一些“内务”信息,例如记录对象的类,ID和状态标志,例如对象当前是否可访问,当前是同步锁定等。

Java对象标头大小因32位和64位jvm而异。

虽然这些是主要的内存消费者,但jvm还需要额外的字段,有时候需要对齐代码等

所以这就是当你的Java对象的所有成员都为null然后它会消耗内存的原因。