struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tim Stavenger (JIRA)" <>
Subject [jira] Commented: (WW-2167) Memory leak when app stopped
Date Fri, 04 Jan 2008 15:36:04 GMT


Tim Stavenger commented on WW-2167:

I've experienced a similar memory leak while in the following environment:

WebLogic 9.2 MP1 
Sun Java 1.5.0_12 and BEA JRockit 90_150_06 (a Sun Java 1.5 equivalent)
Windows XP and Linux (RedHat)

I've noticed Struts and XWork classes remaining in the class loader after undeployment. This
is noticed by both general out of memory exceptions in the heap and perm gen space. I can
also see the memory leak by viewing the classes loaded while using BEA JRockit and JRockit's
memory leak detection tool (similar to many memory profiling applications). Struts and XWork
classes remain in the class loader after undeployment and several garbage collection processes.
Upon redeployment, a new set of the same classes are loaded again (so now there are multiple
copies of the same classes in memory).

The memory leak not only with the application my company is deploying while using Struts 2.0.9,
but also with the Struts 2.0.9 showcase demo application. I believe this shows that my memory
leak issues are not entirely our code's fault, but rather at least in part due to Struts.

Unfortunately I have not been able to pinpoint any particular set of classes as the culprit
for the memory leak, mainly due to my lack of familiarity with the Struts and XWork code base.
However, since I see the same problem with the Struts showcase sample app and a memory profiler,
I would expect similar results to be reproducible most anywhere.

> Memory leak when app stopped
> ----------------------------
>                 Key: WW-2167
>                 URL:
>             Project: Struts 2
>          Issue Type: Bug
>    Affects Versions: 2.0.9
>         Environment: WebSphere (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
> J9VM - 20070420_12448_lHdSMR
> JIT  - 20070419_1806_r8
> GC   - 200704_19)
> JCL  - 20070608
>            Reporter: Adam Crume
>             Fix For: 2.1.2
> 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.

View raw message