7

用户上传了一个包含 100 万字的巨大文件。我解析文件并将文件的每一行放入LinkedHashMap<Integer, String>.

我需要 O(1) 按键访问和删除。此外,我需要保留访问顺序,从任何位置进行迭代和排序。

内存消耗是巨大的。我启用了 Java 8 中出现String的重复数据删除功能,但事实证明它LinkedHashMap消耗了大部分内存。

我发现它LinkedHashMap.Entry 消耗 40 个字节,但只有 2 个指针 - 一个用于下一个条目,一个用于上一个条目。我认为 1 指针应该是 64 位或 32 位。如果我将 409,405,320(字节)除以 6,823,422(条目数),则购买每个条目有 60 个字节。

我想我不需要前一个指针,下一个指针应该足以保持秩序。为什么会LinkedHashMap消耗这么多内存?如何减少内存消耗?

实例发生

4

1 回答 1

1

如何减少内存消耗?

1) 将-XX:+UseCompressedOops标志添加到您的 JVM 启动。

2) 实现您自己的 LinkedHashMap 版本,针对您的需求进行优化。IE。使用原语int作为键而不是Integer,如果您不需要它,请删除“previous”指针等。请注意,复制 OpenJDK 源可能是不可能的,除非您希望在 GPLv2 许可下发布修改后的哈希映射实现,因为 OpenJDK 是 GPLv2。但是,您可以从 Android 开源项目复制和修改 LinkedHashMap 实现,因为它是 Apache 许可的。

于 2017-01-05T03:22:31.757 回答