jboss serwer有时会抛出“发生未处理的异常:
java.lang.OutOfMemoryError:Java堆空间”。
能否请您解释一下它是如何工作的?
一些信息:
Jboss始终在Windows上以独立模式运行。
来自standalone.conf "JAVA_OPTS=-Xms1G -Xmx1G -XX:MaxPermSize=256M"
我部署了约50MB的war文件,经过测试后我将其删除。
此Java堆空间异常的可能原因是什么?
我应该在以下部署之间重新启动服务器吗?
是否有任何清除堆空间的命令?
如果我完全理解地增加-Xmx
参数将无济于事。这只会延迟异常的出现。对吧?
预先感谢
答案 0 :(得分:1)
此Java堆空间异常的可能原因是什么?
表面上,解释很简单。 JVM的堆空间已用完,GC无法回收足够的空间以继续。
但是导致JVM进入该状态的原因是什么?
有很多可能的解释,但它们大体分为三类:
您的应用程序存在内存泄漏。
重复的部署导致内存泄漏。
没有内存泄漏,但有时您的应用程序收到的请求只是需要太多内存。
是否应该在以下部署之间重新启动服务器?
如果部署导致泄漏,则 可能会有所帮助。如果没有,就不会。
是否有任何清理堆空间的命令?
没有命令可以执行此操作。 JVM将在抛出OOME之前运行“完整” GC。
如果我完全理解-Xmx参数的增加将无济于事。这只会延迟异常的出现。对吧?
这取决于。如果根本原因是上面的#3,那么增加堆大小可以解决此问题。但是,如果根本原因是#1或#2,那么调整堆大小(最多)将使JVM在崩溃之间的生存时间更长。
我的建议是首先将其视为“正常”(原因#1)内存泄漏,并使用内存探查器识别并修复可能随时间推移而累积的泄漏。
如果/当您可以确定地排除#1原因时,请考虑其他原因。
答案 1 :(得分:0)
请增加MaxPermSize变量并检查它是否可以工作。
JAVA_OPTS = -Xms1G -Xmx1G -XX:MaxPermSize = 512M
答案 2 :(得分:0)
我完全同意Stephen C的回答,我只想向您展示一种如何分析它的可能方法。
jstat
是JDK
随附的用于监视内存的最小工具。
启动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中。