简体   繁体   English

tomcat在Undeploy上启动线程导致的内存泄漏

[英]Memory leak by tomcat starting a thread on undeploy

I get a warning from tomcat about 我收到了tomcat的警告

A web application appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. Web应用程序似乎已启动名为[Abandoned connection cleanup thread]的线程,但未能停止它。 This is very likely to create a memory leak. 这很可能造成内存泄漏。

This is a known-problem which I solved by calling 这是一个已知问题,我通过调用解决了

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

in MyServler.destroy() . MyServler.destroy() This works fine, except for servlets which were never used. 除了从未使用过的servlet之外,这都可以正常工作。 For such servlets, neither init not destroy get ever called. 对于此类servlet, init不会destroy However, the AbandonedConnectionCleanupThread gets started! 但是, AbandonedConnectionCleanupThread开始了! By modifying its source, I could find out where: 通过修改其来源,我可以找到哪里:

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)

In the stacktrace there's no trace of my code, so I wonder how can I prevent it? 在stacktrace中没有我的代码的踪迹,所以我想知道如何防止它? Alternatively, how can I shut down the thread without MyServlet.destroy() being called? 或者,如何在不MyServlet.destroy()情况下关闭线程?

The above stacktrace is from tomcat6, but tomcat7 leaks as well. 上面的stacktrace来自tomcat6,但是tomcat7也泄漏了。

This, by all means, doesn't seem to be a problem with your code. 无论如何,这似乎与您的代码无关。
It seems that it's something known elsewhere... Check these links that came up from a google search: https://techblog.ralph-schuster.eu/2014/07/09/solution-to-tomcat-cant-stop-an-abandoned-connection-cleanup-thread/comment-page-1/ 似乎这是其他地方已知的东西...检查来自Google搜索的以下链接: https : //techblog.ralph-schuster.eu/2014/07/09/solution-to-tomcat-cant-stop-an -废弃的连接-清理线程/注释页-1 /
https://bugs.mysql.com/bug.php?id=68556 https://bugs.mysql.com/bug.php?id=68556

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM