[ https://issues.apache.org/jira/browse/WW-4058?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13642044#comment-13642044 ]
Rene Gielen commented on WW-4058: --------------------------------- The process is as follows: the ThreadLocal Object itself is kind of a container declared at class instance level (static). It provides access to thread-bound storage. The crucial part is that all thread bound stored items have to be removed before the application goes down, because the threads will persist - these are the request threads from the container thread pool, and they will be re-used until the container itself is shut down. If by the time of the application shutdown a single class of the application is still referenced, the whole classloader doesn't get cleaned up and stays as a zombie in memory. Removal of a thread-bound object is solely possible within the thread that it is bound to. Each other thread, including the one performing the application shutdown, will be able to remove objects from other threads within the ThreadLocal container. > ContainerHolder causes ThreadLocal memory leak > ---------------------------------------------- > > Key: WW-4058 > URL: https://issues.apache.org/jira/browse/WW-4058 > Project: Struts 2 > Issue Type: Bug > Components: Core Actions > Affects Versions: 2.3.14 > Environment: Tomcat 7.0.39 > java version "1.7.0_15" > OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.04.1) > OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode) > Reporter: Boris Morris > Assignee: Lukasz Lenart > Fix For: 2.3.15 > > Attachments: hprof_2.png, hprof.png > > > The localContext ThreadLocal is not cleaned up properly when stopping / > undeploying / redeploying a S2 application. This will in most cases cause the > web application ClassLoader not to be garbage collected, thus leaving a > redeployment memory leak. > I am using Tomcat 7.0.39 and when I undeploy my application the following is > reported in the logs: > {noformat} > 2013-04-23 12:00:31,082 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,083 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,101 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,101 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,101 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,101 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,102 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,102 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,103 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,103 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,103 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > 2013-04-23 12:00:31,103 [request-worker-4] ERROR > org.apache.catalina.loader.WebappClassLoader- The web application [/dev] > created a ThreadLocal with key of type [java.lang.ThreadLocal] (value > [java.lang.ThreadLocal@7f2283e1]) and a value of type > [com.opensymphony.xwork2.inject.ContainerImpl] (value > [com.opensymphony.xwork2.inject.ContainerImpl@330069fc]) but failed to remove > it when the web application was stopped. Threads are going to be renewed over > time to try and avoid a probable memory leak. > {noformat} > After poking around in the heap dump it would seem that Tomcat is correct. > There is indeed a GC root at the ThreadLocal used by the ContainerImpl. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira