假设Java对象只占用对象引用的8个字节是正确的,只要它的所有成员都设置为null
,或者成员的定义是否已经占用了实例中的空间原因是什么?
换句话说,如果我有大量的对象需要节省空间,那么我可以指望将未使用的成员设置为null
以减少内存占用吗?
答案 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 );
两个对象a
和b
本身占用相同数量的内存(它们都包含一个引用),但obj
引用的对象a
占用堆上的内存,因此可以通过将引用设置为null来保存此内存。
答案 3 :(得分:1)
Java Language Specification和Java 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然后它会消耗内存的原因。