CentOS 上 Jenkins 内存溢出定位与解决
一 快速定位 OOM 类型
- 查看系统日志与控制台输出:执行命令查看是否有 OutOfMemoryError 关键字,并关注是 Java heap space 还是 Metaspace/PermGen space。示例:
journalctl -u jenkins -xe 或 tail -n 200 /var/log/jenkins/jenkins.log。
- 区分运行方式:
- 直接以服务运行(常见于 yum 安装):JVM 参数通常在 /etc/sysconfig/jenkins 的 JENKINS_JAVA_OPTIONS 中。
- 部署在 Tomcat:需在 Tomcat 的环境变量(如 JAVA_OPTS)中调整堆与非堆内存。
- Windows 服务或自定义脚本:检查 jenkins.xml 的
<arguments> 中的 -Xmx 等值。
- 辅助监控:使用 jstat -gc 、jmap -heap 观察堆与非堆使用;必要时用 jvisualvm/jconsole 远程连接分析。
以上步骤可快速判断是堆内存不足还是元空间不足,从而决定调整 -Xmx/-Xms 还是 -XX:MetaspaceSize/-XX:MaxMetaspaceSize。
二 调整 JVM 堆与元空间参数
- 直接运行(yum 安装)
编辑 /etc/sysconfig/jenkins,在 JENKINS_JAVA_OPTIONS 中设置堆与元空间(示例为 2GB 堆、256MB 元空间,可按机器内存调整):JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m"
保存后重启:systemctl restart jenkins。
- 部署在 Tomcat
在 Tomcat 配置(如 /etc/default/tomcat7 或 catalina.sh 的 JAVA_OPTS)中设置:JAVA_OPTS="-Djava.awt.headless=true -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m"
重启 Tomcat。
- Windows 服务或自定义脚本
在 jenkins.xml 的 <arguments> 中调整 -Xmx(如 -Xmx1024m),保存并重启服务。
- 参数要点
- 建议 -Xms 与 -Xmx 等值,减少运行时扩缩堆带来的抖动。
- Java 8 及更早使用 -XX:PermSize/-XX:MaxPermSize;Java 8+ 使用 -XX:MetaspaceSize/-XX:MaxMetaspaceSize。
- 若构建包含大量依赖或插件,适当增大 Metaspace。
以上做法对应不同部署形态调整 JVM 参数,能直接缓解 heap 或 metaspace 溢出。
三 构建任务与系统层面的优化
- 控制并发与负载
- 在 Jenkins 系统设置中限制 并发构建数,避免单机过载。
- 将重型任务拆分、使用流水线并行阶段,或迁移到 Agent 节点进行分布式构建。
- 构建环境优化
- 在 Jenkins → 系统设置 → Global properties 设置 MAVEN_OPTS(如
-Xmx1024m),避免构建工具本身 OOM。
- 清理工作空间、删除旧构建产物,减少插件与历史数据占用。
- 系统与 I/O
- 采用 SSD、优化内核网络参数(如 net.core.rmem_max、net.core.wmem_max、net.core.somaxconn),提升 I/O 与并发能力。
这些优化能显著降低主节点与构建节点的内存与 I/O 压力,减少 OOM 复现概率。
四 不同 Java 版本的参数差异与示例
- Java 8 及更早(PermGen)
若出现 PermGen space,在对应配置中增加:-XX:PermSize=128m -XX:MaxPermSize=256m
- Java 8+(Metaspace)
使用 Metaspace 替代 PermGen:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
- 通用堆设置
结合机器内存设置堆大小(示例为 2GB):-Xms2048m -Xmx2048m
- 完整示例(/etc/sysconfig/jenkins)
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m"
以上差异与示例覆盖 PermGen 与 Metaspace 两类常见溢出场景,便于按 Java 版本正确配置。
五 监控与容量规划建议
- 持续监控:使用 jstat/jmap/jvisualvm/jconsole 观察 Eden/Survivor/Old 区与 Metaspace 使用曲线,结合构建并发度与插件数量做容量规划。
- 渐进调优:先设定保守堆(如 1–2GB),观察峰值与 Full GC 频率,再逐步上调;确保留有足够内存给 OS 与其他服务。
- 扩展策略:当单机资源不足时,优先引入 Agent 节点分担构建,或升级服务器内存。
持续监控与评估能确保参数与资源匹配实际负载,避免频繁 OOM。