java - 从 HashMap 中删除未使用的分配内存

标签 java memory hashmap garbage

我想读取一些 XML 文件并将其转换为图形(没有图形,只是一个模型)。但由于文件非常大(2.2 GB),保存所有信息的模型对象变得更大(文件大小的 4 倍...)。

通过网络搜索我试图找到减少对象大小的方法。我尝试了不同的集合类型,但想坚持使用 HashMap (因为我必须具有随机访问权限)。实际的键和值仅占分配内存的一小部分。哈希表大部分是空的...

如果我没有完全错的话,垃圾收集并不能帮助我释放分配的内存并减少 HashMap 的大小。是否有其他方法来释放未使用的内存并缩小 HashMap ?或者有没有办法进行完美的散列?或者我应该使用另一个集合吗?

提前致谢,

塞巴斯蒂安

最佳答案

HashMap 通常只是一个填充了一定百分比容量的引用的大型数组。如果仅填充了 80% 的 map ,则剩余 20% 的数组单元未使用(即为空)。额外的开销实际上只是空(空)单元格。

在 32 位 CPU 上,每个数组单元的大小通常为 4 字节(尽管某些 JVM 实现可能会分配 8 字节)。总体而言,实际上并没有那么多未使用的空间。

一旦您的 map 被填充,您可以将其复制到另一个 HashMap,其尺寸更合适(更小),从而提供更大的填充百分比。

您的问题似乎暗示您担心有更多已分配但未使用的对象。但事实如何呢?

附录

一旦映射几乎填满容量(通常超过 95% 左右),就会分配一个较大的数组,将旧数组的内容复制到新数组,然后留下较小的数组进行垃圾收集。这显然是一个昂贵的操作,因此为 map 选择一个相当大的初始大小是提高性能的关键。

如果您可以(高估)所需的单元格数量,则预分配 map 可以减少甚至消除调整大小操作。

关于java - 从 HashMap 中删除未使用的分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5954583/

相关文章:

java - 从具有多个值的 Hashmap 中获取其中一个值

java - 为什么我在战舰游戏中收到错误 java.lang.NullPointerException?

java - 将 Graphics2D 绘制到另一个 Graphics2D

ios - 在 ARC 下,卸载 viewcontroller 时需要为所有强成员设置 nil 吗?那是必须的吗?

vba - Excel vba : setting a long variable for each object class dramatically increases execution time

c++ - 在另一个函数中使用函数内部声明的 vector

java - 在 Java 中将 HashMap 格式化为 JSON

java - IdentityHashMap.hash() 中这段代码的用途是什么?

java - Swing 的设置大小问题

javascript - JavaScript 队列的 O(1) 删除