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

时间:2009-09-18 12:25:17

标签: java optimization memory

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

换句话说,如果我有大量的对象需要节省空间,那么我可以指望将未使用的成员设置为null以减少内存占用吗?

6 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

对象引用本身仍将占用一些内存,因此唯一可以节省的实际内存来自于已经引用的堆对象。

所以,如果你有

MyClass {
    public Object obj;
    MyClass(Object o) { obj = o; }
}

MyClass a = new MyClass( new HashMap() );
MyClass b = new MyClass( null );

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

答案 3 :(得分:1)

Java Language SpecificationJava Virtual Machine Specification没有说明内存中Java对象的大小 - 故意保留未定义,因为它取决于JVM的实现。这意味着您无法对Java对象通常使用的内存量或内存中Java对象的内存布局做出任何假设。

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

答案 4 :(得分:0)

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

卡格

答案 5 :(得分:0)

当一个Java对象的所有成员都为null时,它会消耗内存,因为 它还对标题,引用和内务管理有一些额外的内存要求。

Java对象使用的堆内存包括

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

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

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

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

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

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

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