struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Boris Morris (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (WW-4058) ContainerHolder causes ThreadLocal memory leak
Date Thu, 25 Apr 2013 17:22:18 GMT

    [ 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

Mime
View raw message