struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rene Gielen (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (WW-4058) ContainerHolder causes ThreadLocal memory leak
Date Thu, 25 Apr 2013 18:20:16 GMT

    [ 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

Mime
View raw message