使用HashMap进行Java内存管理

我正在开发一个应用程序,它将数据库中的大量数据读入Map<String,Map<String,Map>> ,对其进行处理,并使用in将处理后的报告写入电子表格-house xml writer。 整个运行大约需要12个小时。

我发现我得到了

 Exception in thread "CursorController-Thread-0" java.lang.OutOfMemoryError: Java heap space at java.lang.AbstractStringBuilder.(AbstractStringBuilder.java:45) at java.lang.StringBuilder.(StringBuilder.java:68) 

当我尝试编写这个jumbo文件时。 出于这个原因,我认为最好在完成处理时编写每个Map<String,Map> (注意这是一个更深的层)。

我的问题是,我怎样才能确保Map<String,Map>在我写完后不会保留在内存中,因为Map >>仍然会包含它?

完成Map>映射到键"key"您就可以了

 hugeMap.remove("key"); 

这将使null中的条目“空”并使Map>符合垃圾收集的条件(即,永远不会导致堆空间内存不足)。

我会为这类问题选择不同的解决方案。 处理源数据的12个小时很重。

您考虑过任何可扩展的解决方案 对于例如Hadoop?

Map>>上使用map.remove(key)方法。 你可以不时打电话给System.gc(); 强制垃圾收集。

如果要保留结构,可以保留外部地图中写入的Map>。 但可能你应该清除它的内容,以便它是空的。 此外,请确保在处理和编写它时,在清除内容之前,不要在任何地方保留对其成员(映射)的引用。 请参阅以下post,选择最适合您需求的方法使用.clear()或让GC处理它

你不能。

垃圾收集器随时随地运行并释放它喜欢的任何内容。

也就是说,在删除对不再需要的数据的所有引用后,请务必尝试调用System.gc()

无论如何,您已经写过在写入数据时出现内存不足错误。 也许你有一个内存泄漏。