java - 从 Jenkins 到 Tomcat 部署 war 时出现 OutOfMemoryError

标签 java shell tomcat deployment jenkins

我使用以下 shell 命令从 Jenkins 部署应用程序:

rm -rf E:/FooTomcat/apache-tomcat-7.0.55/webapps/foo-web;
rm -rf E:/FooTomcat/apache-tomcat-7.0.55/webapps/foo-web.war;
sleep 2;
cp foo-web/target/foo-web-0.0.1-SNAPSHOT.war E:/FooTomcat/apache-tomcat-7.0.55/webapps/foo-web.war

通常,当定期构建开始时,Tomcat 会耗尽内存,并出现以下错误。

Feb 13, 2015 3:59:58 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive E:\FooTomcat\apache-tomcat-7.0.55\webapps\foo-web.war
Feb 13, 2015 4:00:06 PM org.apache.catalina.startup.HostConfig deployWARs
SEVERE: Error waiting for multi-thread deployment of WAR files to complete
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:818)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1658)

我有一个Windows环境并通过cygwin执行shell。

shell 命令是否有问题,或者是由于内存泄漏?我引入了 sleep ,以便为应用程序取消部署提供一些时间。我从未尝试过增加 sleep 时间。

谢谢。

最佳答案

异常表明您的问题来自于填充 PermGen 空间。它是 Java 存储有关类的元数据(假设加载的类的代码)的内存的一部分。当您部署新的 Web 应用程序时,您会添加新类并增加 PermGen 的负载。更糟糕的是,当您在 90% 的情况下重新部署同一个应用程序时,所使用的类的先前版本保留在内存中,因此您不会从 PermGen 中释放“旧”内存,而只是添加到其中(90 %估计来自使用数据库驱动程序,使用ThreadLocal的框架,调度程序线程......实际上它几乎一直发生)。

默认的 permgen 太小(比如 64M 或其他荒谬的东西)。使用更高的值启动 tomcat,可以通过将 JVM 选项传递给 tomcat 来实现,例如:

JAVA_OPTS = -XX:MaxPermSize=512m -Xmx4024m

(首先将 Perm 大小设置为 512MB,然后将堆大小设置为 4G,这对于现代系统来说已经足够了)。

您在启动 tomcat 之前设置此变量,或者(我更喜欢这种方式,您可以修改/bin/catalina 脚本以始终将它们设置在那里,这样,如果您启动 Tomcat,您就不会“忘记”它们)又是tomcat)。

从 tomact 7 开始,当您取消部署应用程序时,tomcat 日志会显示保留在内存中(并填满 PermGen)的应用程序的警告,您可能需要检查它们并尝试修复一些问题(更新框架、正确关闭)你的线程池...)

关于java - 从 Jenkins 到 Tomcat 部署 war 时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28536190/

相关文章:

Java 图形事件未按我期望的顺序发生

java - 无效算法参数异常 : IV must be specified in CBC mode

linux - 先前命令执行的退出代码始终为 0——在远程 Shell 执行中 $?

python - 使用 cmd.exe 时找不到脚本文件

java - Spring Boot : Uploading, 文件上传校验,异常处理

Java设计: Decouple JNI Library

java - 跟踪垃圾收集

linux - 将行传递给函数 - 使用 sed 逐行覆盖 - BASH

java - eclipse + Maven + Tomcat : testing web apps when the WAR is built with custom options

jakarta-ee - 将 BPM 添加到 J2EE 应用程序的最简单方法是什么?