【问题标题】:My Tomcat re-deploy fails when using Teamcity使用 Teamcity 时,我的 Tomcat 重新部署失败
【发布时间】:2009-03-30 12:09:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: tomcat teamcity


    【解决方案1】:

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

    您可以在 tomcat 启动时increase the PermGen size,这只会让您重新部署更多次而不会耗尽内存,这不是真正的修复,但您可以增加部署次数,直到您必须重新启动.

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        你是如何从 Ant 调用 Tomcat 启动脚本的?

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

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

        【讨论】:

          猜你喜欢
          • 2014-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-23
          • 2021-05-22
          • 1970-01-01
          相关资源
          最近更新 更多