[ 
https://issues.apache.org/jira/browse/WW-4058?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13641969#comment-13641969
 ] 

Boris Morris edited comment on WW-4058 at 4/25/13 5:21 PM:
-----------------------------------------------------------

I haven't studied your code in depth, but the 
[Javadoc|http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html] 
states "Each thread holds an implicit reference to its copy of a thread-local 
variable as long as the thread is alive and the *ThreadLocal instance is 
accessible*"(emphasis mine). That implies that you could just set the reference 
to the ThreadLocal to null and that would allow the references to be GC'd.
It would save you worrying about which threads put what in there.
                
      was (Author: bmorris591):
    I haven't studied you code in depth, but the 
[Javadoc|http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html] 
states "Each thread holds an implicit reference to its copy of a thread-local 
variable as long as the thread is alive and the *ThreadLocal instance is 
accessible*"(emphasis mine). That implies that you could just set the reference 
to the ThreadLocal to null and that would allow the references to be GC'd.

                  
> 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