【问题标题】:Getting java.lang.OutOfMemoryError : java Heap space on Jboss获取 java.lang.OutOfMemoryError:Jboss 上的 java 堆空间
【发布时间】:2020-04-11 19:38:21
【问题描述】:

获取 java.lang.OutOfMemoryError : Jboss 7 上的 java 堆空间 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]

【问题讨论】:

  • 96m 增加到1024m
  • 发生错误时你在做什么?
  • 我正在尝试调用多个 Web 服务和多个 DB 只读操作。
  • 您能否提供有关该系统的更多详细信息?是linux吗?您正在运行哪个 Java 版本?您的系统有多少 RAM 大小?是虚拟机吗?
  • Java版本-1.8,Widnow,RAM-8GB,不是VM,只是windows下的jboss

标签: java arrays jboss jboss7.x


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    java.lang.OutOfMemoryError:OutOfMemoryError 通常意味着你做错了,无论是配置 问题(指定的堆大小对于应用程序来说不足)或持有对象的时间过长(这会阻止对象被垃圾收集),或尝试一次处理太多数据。

    可能的解决方案:

    1) 尝试将“JAVA_OPTS=-Xms1G -Xmx1G -XX:MaxPermSize=256M”设置为最大值并重新启动服务器。

    2) 检查您的代码是否存在内存泄漏。使用一些堆转储阅读器进行检查。 (有多个可用于 IDE 的插件,如 Eclipse、IntelliJ 等)

    3) 检查您的代码(90% 的问题出在代码中):检查您是否正在从数据库或其他来源将多余的数据加载到堆内存中,以及是否确实需要。如果您正在调用多个 Web 服务和多个 DB 只读操作,请交叉检查 db 查询(如果 Join 与正确的 where 子句完美结合)以及从 db 查询和 Web 服务返回的数据量。

    4) 如果问题是由于最近的代码更改引起的,请尝试分析。

    5) 另外,检查缓存和会话元素是否在使用后被清除。

    6) 为确定问题不是由 Jboss 引起的,您可以在其他服务器上运行相同的代码进行测试(Tomcat、Websphere 等)

    7) 查看 Java 文档以进一步了解内存不足错误:Documentation Link

    【讨论】:

      【解决方案3】:

      如果您使用 IntelliJ,请使用以下图片 在 VM 选项中添加您需要的内容

      【讨论】:

        【解决方案4】:

        确保您在bin directory 内的standalone.conf 文件中提供了足够的空间

         JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024m -Djava.net.preferIPv4Stack=true"
        

        您应该将MaxMetaSpaceSize 增加到1024mMetaspaceSize256m 希望它会起作用。

        【讨论】:

        • 我已经将它设置为 set "JAVA_OPTS=-Xms1G -Xmx2G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2096M"
        • 进一步增加取决于很多因素
        • 确保MetaspaceSize 也应该是512m
        • 即使配置 JAVA_OPTS=-Xms1G -Xmx2G -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=2096M 也不起作用
        【解决方案5】:

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

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

        如果您在 Windows 上运行 JBoss,请在 JAVA_OPTS 变量的 standalone.conf.bat 文件中设置以下值 -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) 分析堆转储。

        【讨论】:

          【解决方案6】:

          还可以尝试监控您的进程,尝试运行 jvisualvm(包含在 jdk 中),然后会打开一个 UI,从那里您将能够获得很多信息。

          希望对您有所帮助。

          【讨论】:

            【解决方案7】:

            通常,当在 Java 堆中没有足够的空间来分配对象时会引发此错误。在这种情况下,垃圾收集器无法腾出空间来容纳新对象,并且无法进一步扩展堆。

            请执行以下可能的步骤来修复java.lang.OutOfMemoryError

            第 1 步: 检查 JBoss 配置设置。该设置取决于您的系统配置、java 版本和 JBoss 版本。检查配置here

            第 2 步:检查堆转储设置here

            第 3 步: Java 代码/库问题。

            分析你的记忆hereJboss memory profiler

            此 OutOfMemoryError 消息的其他原因更为复杂,并且是由编程错误引起的。

            【讨论】:

              猜你喜欢
              • 2021-09-09
              • 2012-06-23
              • 2012-04-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-27
              • 1970-01-01
              相关资源
              最近更新 更多