LinkedHashMap 内存消耗

LinkedHashMap memory consumption

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

我需要 O(1) 的密钥访问和删除。另外,我需要保留访问顺序,从任何位置迭代并排序。

内存消耗大。我启用了出现在 Java 8 中的 ,但事实证明 LinkedHashMap 占用了大部分内存。

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

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

How to reduce memory consumption?

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

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