当 Jenkins 在 Ubuntu 上作为守护进程运行时,如何给它更多的堆空间?

Posted

技术标签:

【中文标题】当 Jenkins 在 Ubuntu 上作为守护进程运行时,如何给它更多的堆空间?【英文标题】:How do I give Jenkins more heap space when it's running as a daemon on Ubuntu? 【发布时间】:2013-01-23 14:30:34 【问题描述】:

我的 Jenkins 作业内存不足,在构建日志中提供了 java.lang.OutOfMemoryError 消息。但我使用 Ubuntu 包管理器 aptitudeapt-get 来安装 Jenkins,但我不知道在哪里可以更改分配给 Jenkins 的堆空间量。

【问题讨论】:

【参考方案1】:

为特定作业设置堆大小的另一种方法是为每个作业使用环境变量。这样可以确保在不使用需要更高内存的作业时内存可用。

GRADLE_OPTS="-Dorg.gradle.jvmargs=-Xms1024M -Xmx8192M -XX:PermSize=512M -XX:MaxPermSize=2048 -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8"

JAVA_OPTS="-XX:MaxPermSize=2048M"

【讨论】:

我在任何地方都没有看到这个设置,也许你应该更详细地描述你在哪里找到它。 @FooBar 这些选项来自environment injector plugin【参考方案2】:

如果您使用的是 Ubuntu Server,请先安装 Monitoring 插件以查看 Jenkins 使用了多少内存。比如我安装后看到的是这样的:

然后,使用命令free -m,我计算出服务器的内存大小。就我而言,16Gb。有了这些信息,我打开了/etc/default/jenkins 并更改了:

JAVA_ARGS="-Djava.awt.headless=true"

JAVA_ARGS="-Xmx8384m -Djava.awt.headless=true"

其中 8384 是 8Gb。然后我使用命令sudo service jenkins restart 重新启动了 Jenkins,然后,在触发了内存问题的作业后,事情看起来好多了,并且该作业可以在这次和后续运行中完成:

【讨论】:

你也可以说-Xmx8g,和-Xmx8384m一样,但是更简单。【参考方案3】:

对于 CentOS,jenkins-1.579-1.1 的 Jenkins.xml 所在目录默认为 /etc/sysconfig/

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xmx -XX:MaxPermSize="

【讨论】:

干杯,我几乎要疯了试图找到这个 在我的 openSUSE Leap 42.1 (x86_64) 上,2.70 版的 Jenkins 配置位于 /etc/sysconfig/jenkins 也适用于 RedHat RHEL 7.4、jenkins 2.98 [root@Berder-S-01 ~]# service jenkins restart Restarting jenkins (via systemctl): Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details. [FAILED]【参考方案4】:

在 Jenkins 作业运行时,您可能会遇到两种类型的 OutOfMemoryError 消息:

java.lang.OutOfMemoryError: Heap space - 这意味着你 需要增加分配给 Jenkins 的堆空间量 守护进程启动。 java.lang.OutOfMemoryError: PermGen space - 这意味着您需要增加 分配用于存储 Java 对象元数据的生成空间量。增加 -Xmx 参数的值不会影响此错误。

在 Ubuntu 12.04 LTS 上,取消注释 /etc/default/jenkins 第 10 行的 JAVA_ARGS 设置:

要添加更多 Java 堆空间,请增加 -Xmx Java 参数的值。这设置了内存分配池(垃圾收集堆)的最大大小。 要添加更多 PermGen 空间,请添加参数 XX:MaxPermSize=512m(如果您需要更多,请将 512 替换为其他内容。永久代堆包含有关用户类的元信息。

例如,此提取来自于全新安装 Jenkins 后的默认 /etc/default/jenkins

# arguments to pass to java
#JAVA_ARGS="-Xmx256m"

如果您将堆空间设置为 1 GB,这就是它的样子:

# arguments to pass to java
JAVA_ARGS="-Xmx1048m"

注意不要将堆大小设置得太大,因为无论您分配什么都会减少操作系统和其他程序可用的内存量,这可能导致过度分页(内存在 RAM 和交换磁盘之间来回交换,这会降低您的系统速度)。

如果还设置MaxPermSpace,需要在参数之间加一个空格):

# arguments to pass to java
JAVA_ARGS="-Xmx1048m -XX:MaxPermSize=512m"

进行更改后,从 Jenkins Web 界面优雅地重新启动 Jenkins,或使用 sudo /etc/init.d/jenkins restart 从命令行强制立即重新启动。

我发现以下站点有助于了解 Java 最大和永久代堆大小:http://www.freshblurbs.com/blog/2005/05/19/explaining-java-lang-outofmemoryerror-permgen-space.html

【讨论】:

我想你忘了秒破折号,所以应该是:JAVA_ARGS="-Xmx1048m -XX:MaxPermSize=512m" 谢谢!我已经添加了缺失的破折号。 我发现在我的 Ubuntu 安装中,我必须进入 /etc/init/jenkins.conf 并添加到 JAVA_OPTS="" 行。 (编辑 /etc/default 位置没有效果,我用 jmap 确认了这一点)。 CentOS 有没有办法做到这一点?我没有找到 /etc/default/jenkins 目录。并且所有说 Jenkins 或位于 jenkins 目录中的文件都没有提及 Xmx 或内存。 @Pred 您找到解决问题的方法了吗?我的詹金斯奴隶也有同样的问题,我不知道这些参数应该在哪里传递给 java。谢谢!

以上是关于当 Jenkins 在 Ubuntu 上作为守护进程运行时,如何给它更多的堆空间?的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 使用 Gradle 守护进程构建失败

Jenkins使用Gradle守护程序构建失败

markdown 编辑在Ubuntu服务器上设置qBittorrent作为带Web界面的守护进程(15.04及更高版本)

ubuntu 守护进程supervisor的安装及使用(转载)

Python 脚本作为 linux 服务/守护进程

带有容器的 Jenkins Docker Sidecar 运行守护程序命令