从Jenkins部署战争到Tomcat时出现OutOfMemoryError

时间:2015-02-16 07:10:19

标签: 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命令有问题,还是因为内存泄漏?我介绍了睡眠,以便为应用程序提供一些时间来取消部署。我从未尝试过增加睡眠时间。

感谢。

1 个答案:

答案 0 :(得分:3)

正如异常所示,您的问题来自填充PermGen空间。它是内存的一部分,Java存储有关类的元数据(让我们说出已加载类的代码)。部署新的Web应用程序时,您需要添加新类并增加PermGen的负载。更糟糕的是,当您在90%的情况下重新部署相同的应用程序时,以前版本的已使用类保留在内存中,因此您不会释放旧版本的内容。来自PermGen的内存,但只是添加它(90%的估计来自使用DataBase驱动程序,使用ThreadLocal的框架,调度程序线程......实际上它几乎一直在发生)。

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

JAVA_OPTS = -XX:MaxPermSize = 512m -Xmx4024m

(首先将perm大小设置为512MB,堆大小为4G,这对于现代系统来说很好。)

你在启动tomcat之前设置了这个变量,或者(我更喜欢这样,你可以修改你的/ bin / catalina脚本以便总是将它们设置在那里,这样你就不会忘记'如果你再次启动你的tomcat就可以了。)

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