[ 
http://issues.apache.org/jira/browse/HIVEMIND-161?page=comments#action_12359376 
] 

James Carman commented on HIVEMIND-161:
---------------------------------------

My fix breaks the testConcur() method which does the following:

public void testConcur()
    {
        ThreadEventNotifier n = new ThreadEventNotifierImpl();

        Listener l1 = new Listener();
        ConcurMod l2 = new ConcurMod(n);
        Listener l3 = new Listener();

        n.addThreadCleanupListener(l1);
        n.addThreadCleanupListener(l2);
        n.addThreadCleanupListener(l3);

        n.fireThreadCleanup();

        assertEquals(true, l1._cleanup);
        assertEquals(true, l2._cleanup);
        assertEquals(true, l3._cleanup);

        l1._cleanup = false;
        l2._cleanup = false;
        l3._cleanup = false;

        n.fireThreadCleanup();

        assertEquals(true, l1._cleanup); // Fails here!
        assertEquals(false, l2._cleanup);
        assertEquals(true, l3._cleanup);
    }

Why would we want to call fireThreadCleanup() twice within the same thread?  Is 
that a real possibility/use case?  My fix basically clears the listener list 
out of the thread local variable inside fireThreadCleanup() and therefore, it 
can't cleanup those listeners the second time.

> ThreadLocal object is never removed in ThreadEventNotifierImpl and holds the 
> classloader
> ----------------------------------------------------------------------------------------
>
>          Key: HIVEMIND-161
>          URL: http://issues.apache.org/jira/browse/HIVEMIND-161
>      Project: HiveMind
>         Type: Bug
>   Components: framework
>     Versions: 1.1
>  Environment: Tomcat 5.5.12, J2SE 1.6 Mustang build 62, Win XP SP2
>     Reporter: Kyrill Alyoshin
>     Priority: Critical
>  Attachments: hivemind-threadlocals.pdf
>
> The following prevents the web application classloader from being garbage 
> collected on hot redeploys of web applications. 
> Please note that the issue is present on J2SE 1.5 as well. I use 1.6 only 
> because it has far better support for JVMTI and as such the issue was easy to 
> discover with YourKit profiler. Here it is:
> 1. org.apache.hivemind.service.impl.ThreadEventNotifierImpl puts 
> EventListenerList ("list" variable) on its private ThreadLocal "_storage" 
> variable in addThreadCleanupListener method.
> 2. No where in that class does the actual list gets removed from ThreadLocal.
> Thus, the WebappClassLoader cannot be garbage collected because one of the 
> object that it loaded (i.e. EventListenerList) is strongly referenced by live 
> threads in the container, which leads to huge memory leaks on hot-redeploys.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to