LinkedHashMap内存消耗

时间:2017-01-04 10:41:17

标签: java linkedhashmap trove4j

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

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

内存消耗巨大。我在Java 8中启用了Strings deduplication feature,但事实证明LinkedHashMap占用了大部分内存。

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

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

Instance occurence

1 个答案:

答案 0 :(得分:1)

  

如何减少内存消耗?

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

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