【问题标题】:Jenkins Maven Build 137 Error詹金斯 Maven 构建 137 错误
【发布时间】:2014-09-19 07:27:18
【问题描述】:

我有一个 Maven 项目,它在 Jenkins 中构建了 6 个独立的 Maven 项目。我面临的问题是,随着时间的推移,项目构建失败并给出 137 错误代码:

错误:Maven JVM 意外终止,退出代码为 137

可以在控制台中使用相同的 Maven 目标成功构建项目,但在 Jenkins 中它失败了。重启Jenkins即可解决问题。

我有一些静态数组列表。这些列表用于某些测试用例。这可能是内存泄漏吗?

【问题讨论】:

  • 在 Jenkins 中构建是否总是失败,或者只是有时?能贴一下错误+错误信息吗?
  • 最近它开始失败,现在所有的构建都失败了。
  • 我看到了同样的事情,这就是你得到的所有错误信息。就我而言,我正在运行 maven-frontend-plugin 并且在尝试解决 npm 依赖项时它正在死亡。但是,就错误消息的详细信息而言,仅此而已。
  • 几乎可以肯定是内存问题。似乎有些资源没有被释放。随着时间的推移,它们似乎会累积起来,直到它因这个错误而崩溃,你甚至无法进入 Jenkins。使用service jenkins restart 似乎可以解决问题,但这是对长期问题的短期解决方案。

标签: java maven jenkins


【解决方案1】:

如果您的机器至少有 2 个处理器和 4GB 内存,那么您的 JVM 不仅会在启动时获取 1GB,而且会转为 -server 模式,这意味着内存将被保留以提高性能 (source)。如果您同时运行的 JVM 很少(多个应用程序组件、maven 构建等),您很容易陷入低内存。并且你们中的一个 JVM 可能会被 Linux OOM Killer 杀死,因为您机器上的资源不足。

通过 jvm 默认 Xmx 减少进程的内存占用,即 directly impacted,这很可能与 jvm 实际需要的相差甚远。

给它额外的 java 命令行选项

-Xmx256m -XX:MaxPermSize=512m

或配置系统变量

MAVEN_OPTS=-Xmx256m -XX:MaxPermSize=512m

MaxPermSize 对 java 8+ 没用

【讨论】:

    【解决方案2】:

    通过 Jenkins 运行 Maven 时出现此错误:

    ERROR: Maven JVM terminated unexpectedly with exit code 137
    

    我不小心在 MAVEN_OPTS 参数中放了一个“和”:

    -Xmx1024m and -Xms1024m
    

    然后,我得到了这个错误:

    Error: Could not find or load main class and
    ERROR: Failed to launch Maven. Exit code - 1
    

    删除“和”之后,我重新运行 Jenkins 并收到此错误:

    java.lang.OutOfMemoryError: Java heap space
    

    最后,我使用 Global MAVEN_OPTS 增加了内存:

    -Xmx4096m -Xms4096m
    

    这解决了问题。所以,这似乎与记忆有关。但是,它可能是与机器/VM 相关的问题(如上述 @boskoop 所述)或容器问题(如果 JVM 通过 Jenkins/Docker/etc 运行)。

    【讨论】:

      【解决方案3】:

      我在我们的构建服务器上遇到了同样的行为。恕我直言,该错误与 maven 内存设置(即MAVEN_OPTS)无关,而是与底层(Linux)机器本身(Jenkins 在其上运行)的内存相关。

      (被拒绝的)Jenkins 问题https://jenkins-ci.org/issue/12035 提供了有关此问题的更多详细信息:

      作为参考,状态码 137 (128 + 9) 通常表示(可能因不同的 unix 风格而异)。进程因收到信号而终止。在这种情况下,信号 9 是 SIGKILL 和不可阻挡的杀戮。

      如果是这种情况底层机器/操作系统需要更多虚拟内存。这可以通过添加物理内存或适当的交换空间来添加。

      你应该尝试增加你机器的虚拟内存。

      注意:
      这也解释了为什么 Jenkins 重启(暂时)可以解决问题。

      【讨论】:

      • 请注意:我回答了这个(超过 1 岁)问题,因为我遇到了同样的问题,而且它是 Google 上的第一个热门问题。
      • 我们将 Jenkins 作为守护进程运行,发现调整“-Xmx”启动参数解决了问题——“/usr/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava. awt.headless=true -XX:MaxPermSize=512m -Xmx8192m -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log -- webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --ajp13Port=-1 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20"
      【解决方案4】:

      我遇到了相同的错误代码。此错误代码似乎确实与 Jenkins 环境中的 JVM 资源限制有关。我建议在错误发生后第二次重新运行构建以查看是否可以获得额外/不同的输出,但这肯定取决于构建的哪个部分导致资源问题(在我的原因中,它是一个 Maven 下载)。

      Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000fb7cb000, 7331840, 0) failed; error='Cannot allocate memory' (errno=12)
      #
      # There is insufficient memory for the Java Runtime Environment to continue.
      # Native memory allocation (mmap) failed to map 7331840 bytes for committing reserved memory.
      # An error report file with more information is saved as:
      # /vagrant/args4java/hs_err_pid10470.log
      ERROR: Maven JVM terminated unexpectedly with exit code 1
      Finished: FAILURE
      

      【讨论】:

        【解决方案5】:

        我认为您应该增加内存设置的值 - 例如在 Jenkins 机器上的 MAVEN_OPTS 中,

        MAVEN_OPTS=-Xmx1.5G -XX:MaxPermSize=0.7G 
        

        【讨论】:

        • 您可以附加一个 JVM Monitor(或类似软件)来监控您是否真的有内存泄漏。
        • 我正在使用 VisualVM,请您指导我如何检测内存泄漏。
        • ...我现在看到了...您进行堆转储,然后检查类 - 看看有哪些类型的对象挂起并查找哪些类将它们保存到内存中。
        猜你喜欢
        • 2018-04-08
        • 1970-01-01
        • 2016-01-12
        • 2018-06-30
        • 2018-09-13
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多