Jboss java.lang.OutOfMemoryError:Java堆空间

时间:2018-11-06 09:51:01

标签: java jboss heap-memory

jboss serwer有时会抛出“发生未处理的异常:

  

java.lang.OutOfMemoryError:Java堆空间”。

能否请您解释一下它是如何工作的?

一些信息: Jboss始终在Windows上以独立模式运行。 来自standalone.conf "JAVA_OPTS=-Xms1G -Xmx1G -XX:MaxPermSize=256M" 我部署了约50MB的war文件,经过测试后我将其删除。

此Java堆空间异常的可能原因是什么? 我应该在以下部署之间重新启动服务器吗? 是否有任何清除堆空间的命令? 如果我完全理解地增加-Xmx参数将无济于事。这只会延迟异常的出现。对吧?

预先感谢

3 个答案:

答案 0 :(得分:1)

  

此Java堆空间异常的可能原因是什么?

表面上,解释很简单。 JVM的堆空间已用完,GC无法回收足够的空间以继续。

但是导致JVM进入该状态的原因是什么?

有很多可能的解释,但它们大体分为三类:

  1. 您的应用程序存在内存泄漏。

  2. 重复的部署导致内存泄漏。

  3. 没有内存泄漏,但有时您的应用程序收到的请求只是需要太多内存。

  

是否应该在以下部署之间重新启动服务器?

如果部署导致泄漏,则 可能会有所帮助。如果没有,就不会。

  

是否有任何清理堆空间的命令?

没有命令可以执行此操作。 JVM将在抛出OOME之前运行“完整” GC。

  

如果我完全理解-Xmx参数的增加将无济于事。这只会延迟异常的出现。对吧?

这取决于。如果根本原因是上面的#3,那么增加堆大小可以解决此问题。但是,如果根本原因是#1或#2,那么调整堆大小(最多)将使JVM在崩溃之间的生存时间更长。


我的建议是首先将其视为“正常”(原因#1)内存泄漏,并使用内存探查器识别并修复可能随时间推移而累积的泄漏。

如果/当您可以确定地排除#1原因时,请考虑其他原因。

答案 1 :(得分:0)

请增加MaxPermSize变量并检查它是否可以工作。

  

JAVA_OPTS = -Xms1G -Xmx1G -XX:MaxPermSize = 512M

答案 2 :(得分:0)

我完全同意Stephen C的回答,我只想向您展示一种如何分析它的可能方法。

jstatJDK随附的用于监视内存的最小工具。 启动JBoss之后,您可以使用以下命令开始监视内存和GC:

jstat -gc <JBOSS_PID> 2s

然后可以将输出加载到例如excel中。

现在,当您发现内存发生奇怪的情况时,请进行堆转储:

jcmd <JBOSS_PID> GC.heap_dump <filename>

jcmd也随附JDK

您可以将堆转储加载到MAT中并进行分析。使用MAT需要一些实践和耐心。他们也有一个不错的Tutorial。您还可以在MAT中比较堆转储。

我还建议您将XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path>"添加到您的JAVA_OPTS中。