3

我阅读了有关解决此问题的堆栈溢出页面,并尝试添加命令行选项 -XX:-UseGCOverheadLimit 以及“-Xmx”参数。但是,我的程序仍然抛出了内存不足的错误。

该程序将大量(>40,000 个键)单词保存到 MultiKeyMap 中,并在具有大量内存的服务器上运行。

关于如何避免错误的任何建议?

4

3 回答 3

4

如果您的问题被可靠地减少(老实说,即使不是),我建议激活-XX:+HeapDumpOnOutOfMemoryErrorJVM 标志。当有 时,这将OutOfMemoryError产生内存的二进制转储。然后可以通过Eclipse MAT等工具对其进行分析,以识别潜在的内存泄漏,并帮助解释为什么垃圾收集器很难清除您的对象。

于 2012-10-10T06:51:28.990 回答
1

此问题意味着垃圾收集器无法释放足够的内存让您的应用程序继续运行。因此,即使您使用“XX:-UseGCOverheadLimit”关闭该特定警告,您的应用程序仍然会崩溃,因为它消耗的内存比可用内存多。

我会说你有内存泄漏症状。尝试按照另一个答案中的建议挖掘内存转储,或者尝试Plumbr,这是专为这些情况创建的内存泄漏监视工具。

于 2012-10-10T07:55:00.403 回答
0

“GC 开销限制”可能与内存泄漏有关,但并非必须如此。根据最初的问题,很难说真正的问题是什么。您应该有一个没有所有深奥标志的“正常”命令行配置,以及一个合理的 Xmx 设置来保存您的所有数据。您应该激活详细 gc 日志记录以了解实际导致开销的 GC 并通过更改 GC 策略或生成大小来调整它。

通常,当您使用尝试对内存友好的结构并使用软引用或弱引用时,会出现开销错误。如果您自己使用它们,请仔细检查您是否了解它们的作用,因为它们很容易被误解。

于 2012-11-25T21:15:34.913 回答