用户上传一个包含100万字的大文件。我解析文件并将文件的每一行放入LinkedHashMap<Integer, String>
。
我需要通过密钥进行O(1)访问和删除。此外,我需要保留访问顺序,从任何位置迭代并排序。
内存消耗巨大。我在Java 8中启用了String
s deduplication feature,但事实证明LinkedHashMap
占用了大部分内存。
我发现LinkedHashMap.Entry
consumes 40 bytes,但只有2个指针 - 一个用于下一个条目,一个用于上一个条目。我认为1指针应该是64位或32位。买入,如果我将409,405,320(字节)除以6,823,422(条目数)我每个条目有60个字节。
我认为我不需要前一个指针,下一个指针应该足以保持顺序。为什么LinkedHashMap
消耗了这么多内存?如何减少内存消耗?
答案 0 :(得分:1)
如何减少内存消耗?
1)将-XX:+UseCompressedOops
标志添加到JVM启动。
2)实现您自己的LinkedHashMap版本,根据您的需求进行优化。 I. e。使用原始int
作为键而不是Integer
,如果不需要则删除“previous”指针等。请注意,除非您希望发布修改后的哈希映射,否则复制OpenJDK源可能是不可能的根据GPLv2许可证实施,因为OpenJDK是GPLv2。但是,您可以从Android开源项目复制和修改LinkedHashMap实现,因为它是Apache许可的。