如何解决’java.lang.OutOfMemoryError:超出GC开销限制’

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

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

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

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

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

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

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

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