Java-当值为hashMap时,条目.getValue()发生内存泄漏



我正面临一个奇怪的内存泄漏问题。由于我是解决内存泄漏的新手,我需要一些帮助。

考虑以下代码

for ( Map.Entry<String, HashMap<String, Object>> entry :memtable.RBTree.entrySet()) {
bufferedWriter.write(entry.getKey() + "," + entry.getValue());
bufferedWriter.newLine();
}

注意-memtable。RBTree.entrySet((-它有10000个条目。它是最巧妙的数据结构。

现在的问题是这条线

bufferedWriter.write(entry.getKey() + "," + entry.getValue());

这里,由于entry.getValue()HashMap,我看到了大量的堆内存消耗(大约3GB的堆(

然而,当我简单地做到这一点时——bufferedWriter.write(entry.getKey() + "," + "DUMMY STRING");在这里,我已经用一个伪字符串替换了HashMap——在这里我看到我的程序像风一样运行(只是在600 MB的堆中(

我不明白为什么entry.getValue() - hashmap会导致内存泄漏,而仅仅连接一些随机字符串则不然。

如有任何帮助,我们将不胜感激。

内存使用可能是entry.getValue().toString()的使用。您可以通过更改线条来检查地图的大小,以确认字符串的大小:

bufferedWriter.write(entry.getKey() + "," + entry.getValue().length());

有了一个由10000个键组成的顶级地图,每个键都是一个相当大的子地图,你很容易就会创建很多潜在的非常长的String,形式为:

"originalkey1,{subkey1=value1, .... subkeyNNN=valueNNN}"
...
"originalkey10000,{subkeyA=valueA, .... subkeyXXX=valueXXX}"

这些并不是内存泄漏——它们在使用后会被垃圾收集,但与伪线相比会导致占用空间过大。

如果内存占用是一个问题,请将写入替换为多行,这些行将entry.getValue()组件直接输出到流,而不是隐式附加为大量字符串,例如:

bufferedWriter.write(entry.getKey());
bufferedWriter.write(",{");
// iterate the sub-map here and write
bufferedWriter.write("}");