当Jenkins在Ubuntu上作为守护进程运行时,我该如何为其分配更多的堆空间?

59

我的Jenkins作业内存不足,在构建日志中出现java.lang.OutOfMemoryError错误信息。但我使用Ubuntu软件包管理器aptitudeapt-get安装了Jenkins,我不知道在哪里更改分配给Jenkins的堆空间量。

5个回答

85

在 Jenkins 作业运行期间,可能会遇到两种类型的 OutOfMemoryError 错误消息:

  • java.lang.OutOfMemoryError: Heap space – 这意味着您需要增加在守护程序启动时分配给 Jenkins 的堆空间的数量。
  • java.lang.OutOfMemoryError: PermGen space – 这意味着您需要增加用于存储 Java 对象元数据的代空间的数量。增加 -Xmx 参数的值对此错误没有影响。

在 Ubuntu 12.04 LTS 上,取消注释 /etc/default/jenkins 的第十行上的 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


1
我认为您忘记了秒破折号,所以应该是:JAVA_ARGS="-Xmx1048m -XX:MaxPermSize=512m"。 - Alper Akture
1
我发现在我的Ubuntu安装中,我必须进入/etc/init/jenkins.conf并添加到行JAVA_OPTS=""。(编辑/etc/default位置没有效果,并且我通过jmap确认了这一点)。 - CasualT
1
有没有在CentOS中实现这个的方法?我找不到/etc/default/jenkins目录。所有标有Jenkins或位于jenkins目录中的文件都没有关于Xmx或内存的任何信息。 - FilBot3
@Pred,你找到解决问题的方法了吗?我在我的Jenkins从机上也遇到了同样的问题,不知道应该把这些参数传递给Java的哪个位置。谢谢! - user1164061
1GB 不是 1024MB 吗? - SaundersB
显示剩余3条评论

33

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

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


3
谢谢,我差点找疯了,试图寻找这个。 - bmaher
在我的 openSUSE Leap 42.1 (x86_64) 上,Jenkins 2.70 版本的配置文件位于 /etc/sysconfig/jenkins - user1053510
同样适用于RedHat RHEL 7.4,jenkins 2.98。 - carl verbiest
[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] - Gank

22
如果您正在使用Ubuntu服务器,请先安装监控插件以查看Jenkins使用了多少内存。例如,安装后我看到的是这样的:

enter image description here

接着,通过命令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,之后触发可能会出现内存问题的任务,情况看起来好多了,该任务能够完成并在随后的运行中保持良好状态:

enter image description here


3
你也可以使用"-Xmx8g"来代替"-Xmx8384m",意思相同但更易理解。 - Assi.NET

4

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

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"

Jenkins job config


2
我没有在任何地方看到这个设置,也许你应该更详细地描述一下你在哪里找到它。 - FooBar
@FooBar 这些选项来自于 环境注入插件 - VanagaS
撞上了“OpenJDK 64位服务器VM警告:忽略MaxPermSize选项;在8.0中已删除支持”的问题。 将其更改为“JAVA_OPTS =”-Xmx1024m“”就解决了。 - Mia

2

我在让这个工作起来的过程中遇到了一些困难。 这是关键参数:"_JAVA_OPTIONS"

enter image description here

我尝试了所有其他参数,但它总是像这样运行mvn package:

enter image description here

导致OutOfMemory异常...(AspectJ问题)

在添加环境变量“_JAVA_OPTIONS”后,我注意到我的日志中出现了以下内容:

enter image description here

终于通过了!

我正在运行Jenkins war org.jenkins-ci.main:jenkins-war:2.190.3


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