【发布时间】:2012-08-06 00:33:39
【问题描述】:
由于 Tomcat 中的孤立线程,我遇到了内存泄漏。特别是,Guice 和 JDBC 驱动程序似乎没有关闭线程。
Aug 8, 2012 4:09:19 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named [com.google.inject.internal.util.$Finalizer] but has failed to stop it. This is very likely to create a memory leak.
Aug 8, 2012 4:09:19 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: A web application appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
我知道这与其他问题类似(例如this one),但就我而言,“别担心”的答案是不够的,因为它给我带来了问题。我有 CI 服务器,它会定期更新这个应用程序,并且在 6-10 次重新加载后,CI 服务器会因为 Tomcat 内存不足而挂起。
我需要能够清除这些孤立的线程,这样我才能更可靠地运行我的 CI 服务器。任何帮助将不胜感激!
【问题讨论】:
-
确定这些是OOM错误的原因吗? JDBC 问题通过在上下文销毁事件上使用上下文侦听器终止线程并将驱动程序放入应用程序的 lib 中来解决,因此类加载是在应用程序的上下文中完成的,而不是在容器的上下文中。
-
谢谢。我对这个领域很陌生,所以我完全不确定这是 OOM 错误的原因,但这是我在重新部署这个 Web 应用程序时在 Tomcat 日志中得到的唯一可疑注释。您推荐的有关查找源或正确使用 contextListener 的任何提示?在快速谷歌之后,我没有发现任何明显相关的教程,但如果你能指出我正确的方向,我很乐意阅读这个问题。
-
要使用上下文侦听器卸载驱动程序,请在此处查看答案:stackoverflow.com/questions/3320400/…
-
我遇到了同样的问题。 Tomcat 显示线程“已放弃的连接清理线程”的次数与重新启动 web 应用程序的次数一样多,并且取消注册驱动程序对我没有任何帮助......有什么好消息吗?
-
也许我不是很聪明,但我没有看到与番石榴问题相关的答案(大多数答案都集中在 mysql conn pool),这会影响我(在添加应用程序之前在重新加载/停止时清理得很好):我最终为 perm gen 空间设置了一个更高的限制,因此我可以在 tomcat 重新启动之间等待更多时间。看到 Google 库出现内存泄漏,真是令人难过……