使用Teamcity时,我的Tomcat重新部署失败

时间:2009-03-30 12:10:00

标签: tomcat teamcity

我正在使用Teamcity运行CI,除了一件事之外,它运行得很好:当我的webapp在几次Tomcat耗尽内存后部署到Web容器(Tomcat 5.5)时。这也是你在开发中看到的东西,但它不是一个很大的问题,因为你可以手动重启任何方式 - 使用CI它是全自动的,这使它真的很烦人。

我尝试设置Teamcity,以便它在每次部署时重新启动Tomcat,但后来又遇到了另一个问题 - Tomcat启动脚本在从ant调用时挂起(即启动Tomcat就好了,但后来又没有再进一步了在构建过程中)。

那些有类似Teamcity-Tomcat设置的人?

3 个答案:

答案 0 :(得分:1)

这是tomcat的问题,类加载器和类没有被正确地垃圾收集。每次重新加载webapp上下文时,都会加载这些类的更多副本,并且由于这些类存储在永久堆生成中,因此最终会耗尽内存。

你可以在tomcat启动时increase the PermGen size,这只会让你在没有内存耗尽的情况下重新部署更多次,这不是一个真正的修复,但你可以增加部署的数量,直到你有重启。

答案 1 :(得分:0)

我们有完全相同的问题,正如马克罗宾逊指出的那样,这与没有收集垃圾的课程有关。

我们遇到的特殊问题是加载了很多静态内容:log4j,填充在静态全局中的spring上下文,以及其他创建静态实例或单例的类库。

可以使用分析器跟踪大量这些内容,然后在servlet的destroy()方法中显式处理资源清理。虽然这并没有完全解决问题,但它确实减轻了一些问题。

最后,我们添加了另外一对ant目标来停止和启动Tomcat,并将构建过程包装在这些中。 YMMV。

答案 2 :(得分:0)

我猜这个问题不是TeamCity特有的。

您如何从Ant调用Tomcat启动脚本?

如果您正在使用“exec”任务,则可能需要将“spawn”属性设置为true,以便在另一个进程中生成Tomcat。否则Ant正在等待进程在继续之前结束。

在我们的部署中,我们有一个脚本可以检查permgen级别,并且(如果permgen太高,可选)重启Tomcat。