[ 
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

Reply via email to