Java 使用HashMap时如何处理内存不足异常

Java 使用HashMap时如何处理内存不足异常,java,collections,map,garbage-collection,hashmap,Java,Collections,Map,Garbage Collection,Hashmap,我使用的HashMap一次存储1000个条目。处理完这些记录后,我调用clear()方法并为同一HashMap引用加载1000个新条目。我必须对20000000条记录进行同样的处理。在处理完750000个线程后,Buyt在线程“ThreadedStreamConsumer”java.lang.OutOfMemoryError:java堆空间中给了我异常 我也尝试过WeekHashMap,但它对我也不起作用。处理这个问题的有效方法应该是什么?我想内存泄漏与HashMap无关,而是与其他地方有关。

我使用的HashMap一次存储1000个条目。处理完这些记录后,我调用clear()方法并为同一HashMap引用加载1000个新条目。我必须对20000000条记录进行同样的处理。在处理完750000个线程后,Buyt在线程“ThreadedStreamConsumer”java.lang.OutOfMemoryError:java堆空间中给了我异常


我也尝试过WeekHashMap,但它对我也不起作用。处理这个问题的有效方法应该是什么?

我想内存泄漏与
HashMap
无关,而是与其他地方有关。 您可以通过分析堆转储找到泄漏的位置

为了指示JVM在
OutOfMemoryError
时生成堆转储,请将
-XX:+HeapDumpOnOutOfMemoryError
参数添加到
java
命令行

拥有堆转储后,使用或任何其他您选择的探查器加载它。
这将允许您找到对象中包含对已处理记录的引用的内容,并修改您的程序以防止出现这种情况。

20000000条记录存储在数据库中?查看是否有帮助。。。。要么你没有真正清理地图,要么你在别处保留数据。或者,考虑到“ThreadedStreamConsumer”,您正在旋转太多线程,它们的总消耗量超过了您现有的可用量。但是如果不展示实际的代码,就不可能说出真正的问题是什么。你必须以某种方式消除所有对你想“忘记”的对象的引用。例如,如果您为新的HashMap创建一个新的HashMap,那么必须将对旧HashMap的所有引用都设为null(或者用对新HashMap的引用覆盖它们)。而包含对象列表的任何其他数组都必须进行类似的处理。在某个地方,你挂在旧对象的列表上。记录大小是否相同。错误是否可能发生在导致错误的特定记录中?您是否注意到它是否出现在特定记录中?您能增加项目的可用内存吗?