我从tomcat收到关于
的警告Web应用程序似乎已启动名为[Abandoned 连接清理线程]但未能阻止它。这是非常的 可能会造成内存泄漏。
这是一个已知问题,我通过调用
解决了这个问题com.mysql.jdbc.AbandonedConnectionCleanupThread.shutdown();
MyServler.destroy()
中的。这种方法很好,除了从未使用过的servlet。对于这样的servlet,init
而不是destroy
都不会被调用。但是,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也泄漏了。
答案 0 :(得分:1)
这无论如何都不会对您的代码造成问题。
它似乎是其他地方已知的东西......检查谷歌搜索中出现的这些链接:
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