maaartinus
maaartinus

Reputation: 46422

Memory leak by tomcat starting a thread on undeploy

I get a warning from tomcat about

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 is a known-problem which I solved by calling

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

in MyServler.destroy(). This works fine, except for servlets which were never used. For such servlets, neither init not destroy get ever called. However, the AbandonedConnectionCleanupThread gets started! 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? Alternatively, how can I shut down the thread without MyServlet.destroy() being called?

The above stacktrace is from tomcat6, but tomcat7 leaks as well.

Upvotes: 0

Views: 4230

Answers (1)

ernest_k
ernest_k

Reputation: 45319

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/
https://bugs.mysql.com/bug.php?id=68556

Upvotes: 1

Related Questions