2011-10-09 72 views
3

我收到有关正在启动的线程的异常,而不是正在结束或正在停止。 WebappClassLoader抱怨这些线程会导致内存泄漏。Tomcat抱怨线程没有停止

发生了什么事吗?

  1. 是否有可能这样的线程会导致内存泄漏?或者可能吗?
  2. Catalina是否过于敏感?
  3. 这是一个有效的编程技术吗?

(管理一个Tomcat应用程序的这一方面是新的给我,但我要学习它的web应用程序运行了高负荷下的数据库连接,这需要解决。搜索内存泄漏是一个。

回答

2

的数量,我们正在调查事情)您可以了解在http://wiki.apache.org/tomcat/MemoryLeakProtection在Tomcat中棘手的内存泄漏问题(这个警告尤其是) - 尤其是你的提醒你看:

如果一个webapp创建一个线程,默认情况下它的上下文classloader被设置为父线程中的一个(创建新线程的线程)。在webapp中,这个父线程是tomcat工作线程之一,当它执行webapp代码时,其上下文classloader被设置为webapp类加载器。

此外,派生线程可能正在执行(或阻塞)涉及webapp加载的类的一些代码,从而阻止收集webapp类加载器。

因此,如果生成的线程在应用程序停止时未正确终止,则由于生成的线程保留强引用,webapp类加载器将会泄漏。

这个(以我的经验)的影响是有限的,当你启动你的web应用程序一次,然后简单地把它撕下来。但是,在某些情况下(例如在持续集成方案中(CI服务器将应用程序的构建重复部署到未重新启动的Tomcat容器中)),可能会在JVM中快速耗尽内存。这最终将在您的PermGen地区中显示为OutOfMemoryException(假设您使用的是Sun/Oracle JVM)。有关PermGen的更多详细信息,请参阅http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

+0

我对影响应与之相似的理解与您的相似。无论如何,我们总是重新启动Tomcat。 – staticsan