在Jboss上出现java.lang.OutOfMemoryError: java堆空间不足错误

4
在Jboss 7上遇到了java.lang.OutOfMemoryError : java Heap space错误 JBoss配置文件中的输入为

set "JAVA_OPTS=-Xms1G -Xmx2G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2096M"

错误信息为:

 java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3332) [rt.jar:1.8.0_231]
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) [rt.jar:1.8.0_231]
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) [rt.jar:1.8.0_231]
        at java.lang.StringBuffer.append(StringBuffer.java:270) [rt.jar:1.8.0_231]
        at java.io.StringWriter.write(StringWriter.java:112) [rt.jar:1.8.0_231]
        at java.io.PrintWriter.write(PrintWriter.java:456) [rt.jar:1.8.0_231]
        at java.io.PrintWriter.write(PrintWriter.java:473) [rt.jar:1.8.0_231]
        at java.io.PrintWriter.print(PrintWriter.java:603) [rt.jar:1.8.0_231]
        at java.io.PrintWriter.println(PrintWriter.java:756) [rt.jar:1.8.0_231]
        at java.lang.Throwable$WrappedPrintWriter.println(Throwable.java:765) [rt.jar:1.8.0_231]
        at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:698) [rt.jar:1.8.0_231]
        at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:710) [rt.jar:1.8.0_231]

1
96m增加到1024m - manikant gautam
当出现那个错误时,你在做什么? - radulfr
1
我正在尝试调用多个 Web 服务和多个只读数据库操作。 - Rajeev Ranjan
请问您能否提供有关该系统的更多详细信息?它是Linux系统吗?您正在运行哪个Java版本?您的系统内存大小是多少?它是虚拟机吗? - nagendra547
1
Java版本-1.8,Windows系统,内存8GB,它不是虚拟机,只是在Windows下运行的jboss。 - Rajeev Ranjan
7个回答

4
你遇到了“OutOfMemoryError: Java heap space”的问题,在这种情况下,你不需要增加MetaSpace。我建议你增加堆分配(Xms3G-Xmx3G)。确保Xms和Xmx的值相同。如果仍然遇到相同的问题,则添加“-XX:+HeapDumpOnOutOfMemoryError”选项。当发生OOM错误时,此选项将生成堆转储。您可以通过eclipse mat等工具分析此堆转储,以检查哪些对象消耗更多的内存,以及是否存在任何内存泄漏。

3

根据部署在JBoss上的应用程序,即使使用2GB堆也可能不够。

潜在问题:
  1. Xmx配置未应用(配置错误的文件)
  2. 应用程序需要更多堆
  3. 应用程序中存在内存泄漏

如果您在Windows上运行JBoss,请在standalone.conf.bat文件中的JAVA_OPTS变量中设置以下值-Xmx2G -XX:MaxMetaspaceSize=1G

standalone.conf文件在Windows上被忽略,仅在*nix系统上应用。

通过使用JConsole(JDK的一部分)或JVisualVM连接到JVM,可以验证这些值是否已应用。

使用这些工具,您可以监视堆使用情况并查看是否需要更多堆。

如果堆大小足够大(例如4+GB),并且在垃圾回收(GC)不释放空间的情况下,堆仍然不断增长,则可能存在内存泄漏。
要进行分析,请将以下标记添加到JAVA_OPTS中:-Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError
使用这些标志,JVM将记录GC活动到gc.log文件中,在其中可以明确看到GC后释放了多少空间。
如果根据日志执行的后续GC未释放任何空间,则可能存在内存泄漏,并且您应该使用JVisualVM手动创建或由JVM自身在OutOfMemoryError时创建的堆转储进行分析。可以使用JVisualVM或Eclipse Memory Analyzer (MAT)分析堆转储。

3
如果您使用IntelliJ,请使用以下图片,在VM选项中添加所需内容。 enter image description here

2
java.lang.OutOfMemoryError: OutOfMemoryError通常意味着您正在做错事情,可能是配置问题(指定的堆大小不足以支持应用程序)或者持有对象时间过长(这会防止对象被垃圾回收),或者尝试一次处理太多数据。 可能的解决方案: 1) 尝试将"JAVA_OPTS=-Xms1G -Xmx1G -XX:MaxPermSize=256M "设置为最大值,并重新启动服务器。
2) 检查代码是否存在内存泄漏。使用一些堆转储读取器来检查(如Eclipse、IntelliJ等IDE的多个插件可用)。
3) 检查您的代码(90%的问题都在代码中):检查是否从数据库或其他源加载了过多数据到堆内存中,以及是否真正需要。如果您调用多个Web服务和多个DB只读操作,请交叉检查db查询(如果使用正确的where子句完美地使用连接)和从db查询和Web服务返回的数据量。
4) 如果问题是由于最近的代码更改引起的,则尝试分析相同的问题。
5) 同样,请检查缓存和会话元素是否在使用后清除。
6) 为了确保问题不是由于Jboss引起的,请在其他服务器上运行相同的代码进行测试(如Tomcat、Websphere等)。
7) 查看Java文档以更好地理解内存不足错误:文档链接

1

同时尝试监控您的进程,尝试运行jvisualvm(包含在jdk中),将打开一个UI界面,从那里您将能够获得大量信息。

希望这可以帮到你。


1
通常情况下,当Java堆中没有足够的空间来分配对象时,就会抛出此错误。在这种情况下,垃圾收集器无法提供空间以容纳新对象,堆也无法进一步扩展。
请按以下可能步骤修复java.lang.OutOfMemoryError:
第一步:检查JBoss配置设置。该设置取决于您的系统配置、Java版本和JBoss版本。在此处检查配置here
第二步:检查堆转储设置here
第三步:Java代码/库问题。
分析您的内存hereJboss memory profiler
此OutOfMemoryError消息的其他原因更为复杂,是由编程错误引起的。

1
请确保您在bin目录内的standalone.conf文件中提供了足够的空间。
 JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024m -Djava.net.preferIPv4Stack=true"

你需要将MaxMetaSpaceSize增加到1024m,将MetaspaceSize增加到256m,希望这样会起作用。

1
我已经将其设置为"JAVA_OPTS=-Xms1G -Xmx2G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2096M"。 - Rajeev Ranjan
1
进一步增加取决于许多因素。 - manikant gautam
1
确保MetaspaceSize也应该是512m - manikant gautam
即使对于配置 JAVA_OPTS=-Xms1G -Xmx2G -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=2096M,它也无法正常工作。 - Rajeev Ranjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接