java - Tomcat Guice/JDBC 内存泄漏

标签 java tomcat

由于 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 服务器。任何帮助将不胜感激!

最佳答案

我刚刚自己处理了这个问题。与其他一些答案相反,我不建议发出 t.stop() 命令。此方法已被弃用,并且有充分的理由。引用 Oracle's reasons为此。

但是,有一种解决方案可以消除此错误,而无需求助于 t.stop()...

您可以使用@Oso 提供的大部分代码,只需替换以下部分

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
for(Thread t:threadArray) {
    if(t.getName().contains("Abandoned connection cleanup thread")) {
        synchronized(t) {
            t.stop(); //don't complain, it works
        }
    }
}

使用MySQL驱动提供的如下方法替换:

try {
    AbandonedConnectionCleanupThread.shutdown();
} catch (InterruptedException e) {
    logger.warn("SEVERE problem cleaning up: " + e.getMessage());
    e.printStackTrace();
}

这应该正确关闭线程,错误应该消失。

关于java - Tomcat Guice/JDBC 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30057851/

相关文章:

java - 在 Tomcat 上运行 SolrCloud 时出现 FileNotFoundException

java - 使用 BufferedReader 在 Java 中按任意键

java - 使用许多方法实现接口(interface) = 巨大的类。模式来拯救?

java - PrintWriter:读取和写入同一文件 - 文件在再次打开之前似乎未保存

java - 无法安装断点-Wildfly远程调试/Eclipse

java - Tomcat 上的 Tapestry Web App 偶尔会吐出垃圾

java - Apache Velocity 标准日志记录配置会产生过多的日志输出

java - 运行 EMR 时出现 "Error: Could not find or load main class"?

jsp - request.getRemoteUser() 的 JSP EL 等价物是什么?

java - Intellij tomcat 服务器控制台编码问题与 log4j 的编码 = UTF-8?