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

时间:2012-10-10 06:25:53

标签: java memory redhat

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

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

相关问题