当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 );
两个对象a
和b
本身占用相同数量的内存(它们都包含一个引用),但是由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然后它会消耗内存的原因。
- 多模块maven项目中的Spring启动配置
- Java:如何防止EntityResolver中的’systemId’#resolveEntity(String publicId,String systemId)从绝对化到当前工作目录
- 域名未指向已安装的Java WebApplication在并行plesk中,删除端口号
- 将ObjectNode写入JSON字符串,使用UTF-8字符转换为ASCII
- 如何在更改变量值时更新JTextField?
- 在jBoss AS中创建模块
- 在Java中转换美元(整数)的美元(大十进制)的最佳方法是什么?
- 在hibernate中插入大量记录的最佳方法
- 如何在Mac上运行时在X11上显示java swing