【发布时间】:2015-05-12 09:54:14
【问题描述】:
团队,
我们所知道的是 NULL 引用将在 32 位机器中占用 4 字节的堆内存。
假设我有数百万个用于下面这个类的对象,但只有一些索引填充了有效对象。让我们采取最坏的情况,即一个索引填充了 255。因此,为 NULL 引用分配了 (1,000,000 * 254 * 4) 个字节,这对于 1GB RAM 机器来说是昂贵的。
Class A{
A [] arrayRef = new A [255];
}
或
Class A{
A ref1, ref2, ref3, ... ref255;
}
任何项目有什么用;它保存了数百万个 NULL 引用并为此分配了 400 万个字节。
所以
- 在 java/jvm 中有没有办法创建惰性空引用内存?是指在使用
new关键字为其分配有效对象之前不为 NULL 引用分配内存? - 这种为未初始化的引用分配内存在 C、javascript 等所有语言中是否常见?任何语言都反对这个概念?
关于地图的另一个用例;假设 Map 的大小已经增长了一千万,然后在运行时缩小到一万,所以初始化的 Map Array 大小将保持原样,空引用会占用内存;可以优化。
最后为所有反对的选民
如果 NULL 引用不需要内存;那么 HashMap 总是可以用 Array[Integer.MaxSize] 初始化;然后在不因掩蔽而重新散列和冲突的情况下查找桶
更新:
看起来 Array 在使用之前需要顺序内存来满足其大小。因此,尽管我们在其中有 NULL 引用,但大多数编程语言都无法阻止分配内存。 但我不明白为什么是一样的;就类引用而言也是预期的??
【问题讨论】:
-
这段代码看起来令人不安。
-
这不是特别大的内存量。为什么不使用数组或 Java 集合之一?
-
@Gergely Bacso 我没明白你说的打扰是什么意思..?
-
行为相同,但代码更简单,更易于管理。
-
@KanagaveluSugumar 好吧,您的问题是 100 个对象,而不是 10000 个。即使是 10000 个,根据您的数字也只有 10MB。也许您可以准确地描述您的应用程序实际上想要做什么。过早的优化是不成熟的。
标签: java memory memory-management jvm