我的Jenkins作业内存不足,在构建日志中出现java.lang.OutOfMemoryError
错误信息。但我使用Ubuntu软件包管理器aptitude
或apt-get
安装了Jenkins,我不知道在哪里更改分配给Jenkins的堆空间量。
我的Jenkins作业内存不足,在构建日志中出现java.lang.OutOfMemoryError
错误信息。但我使用Ubuntu软件包管理器aptitude
或apt-get
安装了Jenkins,我不知道在哪里更改分配给Jenkins的堆空间量。
在 Jenkins 作业运行期间,可能会遇到两种类型的 OutOfMemoryError
错误消息:
java.lang.OutOfMemoryError: Heap space
– 这意味着您需要增加在守护程序启动时分配给 Jenkins 的堆空间的数量。java.lang.OutOfMemoryError: PermGen space
– 这意味着您需要增加用于存储 Java 对象元数据的代空间的数量。增加 -Xmx
参数的值对此错误没有影响。在 Ubuntu 12.04 LTS 上,取消注释 /etc/default/jenkins
的第十行上的 JAVA_ARGS
设置:
-Xmx
Java 参数的值。这将设置内存分配池(垃圾回收堆)的最大大小。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。
对于CentOS,jenkins-1.579-1.1默认情况下Jenkins.xml所在的目录为/etc/sysconfig/。
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xmx -XX:MaxPermSize="
/etc/sysconfig/jenkins
。 - user1053510[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接着,通过命令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,之后触发可能会出现内存问题的任务,情况看起来好多了,该任务能够完成并在随后的运行中保持良好状态: