struts-issues mailing list archives

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


Nicolas Raynaud commented on WW-2167:

Tim > I've not even yet resolved the issue on MY case yet (its now a log4j problem I'm
investigating), and looking at the code practice of the project, I suppose that opportunities
for memory leak are quite numerous.

This is a self-reinforcing worst case : one reference is enough to create the leak, but the
probability to have many leaks is high if you don't specifically test against it.

I far as I know, only commiters can really solve this problem, but for this they have to feel
concerned about it, because it is a really hard problem. Finding a path between a GC root
and an object is easy with appropriate tool, but connecting the memory map to the code path
that led to it is hard.

> 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