我的 Jenkins 作业内存不足,java.lang.OutOfMemoryError
在构建日志中提供消息。但是我使用了 Ubuntu 包管理器,aptitude
或者apt-get
安装了 Jenkins,但我不知道在哪里可以更改分配给 Jenkins 的堆空间量。
4 回答
OutOfMemoryError
在Jenkins 作业运行时,您可能会遇到两种类型的消息:
java.lang.OutOfMemoryError: Heap space
– 这意味着您需要在守护进程启动时增加分配给 Jenkins 的堆空间量。java.lang.OutOfMemoryError: PermGen space
– 这意味着您需要增加为存储 Java 对象元数据分配的生成空间量。增加-Xmx
参数的值不会影响这个错误。
在 Ubuntu 12.04 LTSJAVA_ARGS
上,取消注释第 10 行的设置/etc/default/jenkins
:
- 要添加更多 Java 堆空间,请增加
-Xmx
Java 参数的值。这设置了内存分配池(垃圾收集堆)的最大大小。 - 要添加更多 PermGen 空间,请添加参数(如果需要更多,请
XX:MaxPermSize=512m
替换为其他内容。永久代堆包含有关用户类的元信息。512
例如,此摘录来自/etc/default/jenkins
全新安装 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="
如果您使用的是 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。然后我使用命令重新启动了 Jenkins,sudo service jenkins restart
然后,在触发出现内存问题的作业后,情况看起来好多了,并且该作业可以在此运行和后续运行中完成: