詹金斯 Maven 构建 137 错误
Posted
技术标签:
【中文标题】詹金斯 Maven 构建 137 错误【英文标题】:Jenkins Maven Build 137 Error 【发布时间】: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
似乎可以解决问题,但这是对长期问题的短期解决方案。
【参考方案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,请您指导我如何检测内存泄漏。 ...我现在看到了...您进行堆转储,然后检查类 - 看看有哪些类型的对象挂起并查找哪些类将它们保存到内存中。以上是关于詹金斯 Maven 构建 137 错误的主要内容,如果未能解决你的问题,请参考以下文章
出现 OutOfMemoryError:在詹金斯中执行 maven 构建时 PermGen 空间