用户上传一个由100万个单词组成的巨大文件。我解析文件并将文件的每一行放入LinkedHashMap<Integer, String>中。
我需要O(1)访问和删除键。此外,我需要保留访问顺序,从任何位置迭代和排序。
内存消耗巨大。我启用了Java 8中出现的Strings去重功能,但结果表明LinkedHashMap消耗了大部分内存。
我发现LinkedHashMap.Entry 消耗40字节,但只有两个指针-一个用于下一个条目,一个用于上一个条目。我认为1个指针应该是64位或32位。但如果我将409,405,320(字节)除以6,823,422(条目数),我得到每个条目60字节。
我需要O(1)访问和删除键。此外,我需要保留访问顺序,从任何位置迭代和排序。
内存消耗巨大。我启用了Java 8中出现的Strings去重功能,但结果表明LinkedHashMap消耗了大部分内存。
我发现LinkedHashMap.Entry 消耗40字节,但只有两个指针-一个用于下一个条目,一个用于上一个条目。我认为1个指针应该是64位或32位。但如果我将409,405,320(字节)除以6,823,422(条目数),我得到每个条目60字节。
我认为我不需要前一个指针,只有下一个指针就足以保持顺序。为什么LinkedHashMap
会消耗这么多内存?如何减少内存消耗?
Integer
包装器使用了那么多额外的内存吗?也许一个基于int
的实现可以帮助。参考:https://github.com/ggrandes/kvstore/blob/master/src/main/java/org/javastack/kvstore/structures/hash/IntLinkedHashMap.java - SalemInteger
占用了堆的 16%。而LinkedHashMap.Entry
则占用了超过 3 倍。我认为 OP 想知道为什么会出现这种情况。 - MichaelHashMap.Node
,它还有4个字段,并且还有其他对象头,其大小只是实现细节。 - glee8ejava.util.LinkedHashMap$Entry 240,034,920 (32.3%) 6,000,873 (24.5%)
。也许你有一些内存泄漏:[(https://hoangx281283.wordpress.com/2012/11/18/wrong-use-of-linkedhashmap-causes-memory-leak/] (https://hoangx281283.wordpress.com/2012/11/18/wrong-use-of-linkedhashmap-causes-memory-leak/) - Planck Constant