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

Sean Kleinjung commented on WW-2167:
------------------------------------

Searching for other places that call the init and cleanup methods of Dispatcher 
reveals two more locations that probably lead to the creation of ThreadLocals 
that do not get removed. First is the init() and destroy() methods of 
Jsr168Dispatcher. I do not have a portal application that I can use to test 
this class, although if there is a problem a similar try..finally to the one I 
previously posted should fix it. The last place I can see this problem 
occurring is in the org.apache.struts2.util.StrutsTestCaseHelper#initDispatcher 
method. This last one, however, is of a lower priority because unit tests 
rarely have the type of lifecycle where classloader leaks would be a serious 
problem.

> Memory leak when app stopped
> ----------------------------
>
>                 Key: WW-2167
>                 URL: https://issues.apache.org/struts/browse/WW-2167
>             Project: Struts 2
>          Issue Type: Bug
>    Affects Versions: 2.0.9
>         Environment: WebSphere 6.1.0.9 (non-network deploy) on Windows XP 
> Professional
> java version "1.5.0"
> Java(TM) 2 Runtime Environment, Standard Edition (build pwi32devifx-20070608 
> (SR5+IY99712))
> IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 
> j9vmwi3223-20070426 (JIT enabled)
> J9VM - 20070420_12448_lHdSMR
> JIT  - 20070419_1806_r8
> GC   - 200704_19)
> JCL  - 20070608
>            Reporter: Adam Crume
>             Fix For: 2.1.2
>
>         Attachments: FilterDispatcher_leak-fix.java, log_leak.png
>
>
> Struts 2 somehow prevents the app's classes from being garbage collected when 
> the application is stopped or undeployed.
> I created a barebones Struts 2 app with an action with the following code:
>       private static final Object x = new Object() {
>               {
>                       System.out.println("================== Object created: 
> " + hashCode() + " ===================");
>               }
>               protected void finalize() throws Throwable {
>                       System.out.println("**************** Object finalized: 
> " + hashCode() + " *********************");
>               };
>       };
> Because of this static field, a message should be printed when the class is 
> initialized and when it is garbage collected.  "Object created" would be 
> printed out whenever I went to the action for the first time, but restarting 
> the app never printed "Object finalized."  This is not an issue with garbage 
> collection in my web container because doing the same thing with a servlet 
> resulted in both messages being printed.
> One problem is that the FilterDispatcher.init() method sets a ThreadLocal but 
> never clears it.  I fixed that by adding ActionContext.setContext(null); to 
> the end of the init() method, but that didn't solve the larger problem.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to