我想读取一些 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/