java - tomcat 在取消部署时启动线程导致内存泄漏

标签 java tomcat servlets memory-leaks

我收到来自 tomcat 的警告

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.

这是一个已知问题,我通过调用解决了

com.mysql.jdbc.AbandonedConnectionCleanupThread.shutdown();

MyServler.destroy() 中。这工作正常,除了从未使用过的 servlet。对于这样的 servlet,initdestroy 都不会被调用。但是,AbandonedConnectionCleanupThread 启动了!通过修改它的源代码,我可以找出位置:

com.mysql.jdbc.AbandonedConnectionCleanupThread.start(AbandonedConnectionCleanupThread.java:19)
com.mysql.jdbc.NonRegisteringDriver.<clinit>(NonRegisteringDriver.java:106)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:526)
java.lang.Class.newInstance(Class.java:383)
java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:373)
java.util.ServiceLoader$1.next(ServiceLoader.java:445)
java.sql.DriverManager$2.run(DriverManager.java:510)
java.sql.DriverManager$2.run(DriverManager.java:490)
java.security.AccessController.doPrivileged(Native Method)
java.sql.DriverManager.loadInitialDrivers(DriverManager.java:490)
java.sql.DriverManager.<clinit>(DriverManager.java:100)
org.apache.catalina.loader.JdbcLeakPrevention.clearJdbcDriverRegistrations(JdbcLeakPrevention.java:45)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.apache.catalina.loader.WebappClassLoader.clearReferencesJdbc(WebappClassLoader.java:1775)
org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:1704)
org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1622)
org.apache.catalina.loader.WebappLoader.stop(WebappLoader.java:710)
org.apache.catalina.core.StandardContext.stop(StandardContext.java:4649)
org.apache.catalina.manager.ManagerServlet.undeploy(ManagerServlet.java:1365)
org.apache.catalina.manager.HTMLManagerServlet.undeploy(HTMLManagerServlet.java:563)
org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:123)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:745)

在堆栈跟踪中没有我的代码痕迹,所以我想知道如何防止它发生?或者,如何在不调用 MyServlet.destroy() 的情况下关闭线程?

上面的堆栈跟踪来自 tomcat6,但 tomcat7 也有泄漏。

最佳答案

无论如何,这似乎不是您的代码的问题。
它似乎在其他地方广为人知......检查来自谷歌搜索的这些链接: https://techblog.ralph-schuster.eu/2014/07/09/solution-to-tomcat-cant-stop-an-abandoned-connection-cleanup-thread/comment-page-1/
https://bugs.mysql.com/bug.php?id=68556

关于java - tomcat 在取消部署时启动线程导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35201461/

相关文章:

Spring (数据、mvc、安全)依赖项 : IncompatibleClassChangeError

eclipse - ClassNotFoundException DelegatingFilterProxy

java - 如何让 session 不超时?

java - 简单的 Servlet 应用程序,在哪里存储我可以引用的配置设置?

java - 如何阻止每秒帧数下降?

java - 当任何 child 获得焦点时,如何捕获 parent 的 keyEvent?

tomcat - Jersey 支持 CORS 吗?

java - JAXB "grammar is not specified"

java - 在java中创建HashMap的二维数组

java - 电子邮件收到两次,但我只想要一次