使用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()
。
无论如何,您已经写过在写入数据时出现内存不足错误。 也许你有一个内存泄漏。