我正在获取有关正在启动但未结束或被停止的线程的异常。 WebappClassLoader抱怨这些线程会导致内存泄漏。
这里发生了什么?
(管理Tomcat应用程序的这个方面对我来说是新的。但我必须学习它,因为webapp在高负载下耗尽了数据库连接,这需要解决。搜索内存泄漏是一个数字之一我们正在研究的事情。)
答案 0 :(得分:3)
您可以在http://wiki.apache.org/tomcat/MemoryLeakProtection阅读有关Tomcat中棘手的内存泄漏问题(特别是此警告) - 尤其是您看到的警告:
如果webapp创建一个线程,默认情况下它的上下文类加载器设置为父线程(创建新线程的线程)之一。在webapp中,此父线程是tomcat工作线程之一,其上下文类加载器在执行webapp代码时设置为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