1

我正在使用 Teamcity 运行 CI,它运行良好,除了一件事:当我的 webapp 在几次 Tomcat 内存不足后部署到 web 容器(Tomcat 5.5)时。这也是您在开发中看到的东西,但从那时起您可以以任何方式手动重新启动,这并不是一个大问题 - 使用 CI 它是全自动的,这真的很烦人。

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

有类似 Teamcity-Tomcat 设置的人吗?

4

3 回答 3

1

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

您可以在 tomcat 启动时增加 PermGen 大小,这只允许您重新部署更多次而不会耗尽内存,这并不是真正的修复,但您可以增加部署次数,直到您必须重新启动。

于 2009-03-30T12:24:00.123 回答
0

我们遇到了完全相同的问题,正如 Mark Robinson 所指出的,这与没有收集垃圾的类有关。

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

可以使用探查器跟踪其中的很多内容,然后在 servlet 的destroy()方法中明确处理资源清理。虽然这并没有完全解决问题,但确实缓解了一些问题。

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

于 2009-03-30T13:41:31.513 回答
0

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

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

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

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

于 2010-12-10T22:11:57.657 回答