Re: Thread leak with ReloadingCacheManager
Keats Kirsch <[email protected]> Wed, 08 Mar 2006 10:54:43 -0500
| Newsgroups | gmane.comp.java.webmacro.user |
|---|---|
| Message-ID | <[email protected]> |
I haven't had a chance to validate what you are saying, but I know there
has been a longstanding issue with getting WM Web apps to unload
properly. It sounds like you've finally nailed it.
I think your approach of adding a destroy method to the Broker makes
sense. If you're willing to work on it that would be great.
Nice work.
Keats
Alex Twisleton-Wykeham-Fiennes wrote:
>All,
>
>I've just been spending a couple of days trying to track down why memory gets
>consumed when reloading the same web application under tomcat which according
>to my research is related to class loader confusion [1].
>
>During the course of my testing (running OptimizeIt across the tomcat5 process
>and analysing class loading and object creation across multiple reloads),
>I've been noticing the number of Threads growing with each reload which
>didn't seem correct at all.
>
>The increasing threads were getting allocated by ReloadingCacheManager and
>where being utilised by the ClockDaemon process for triggering the expiration
>of assets from the template and url Providers (using the standard webmacro
>defaults file).
>
>These would normally get destroyed when the destroy() method was invoked on
>the ReloadingCacheManager, but I couldn't find any where that enabled me to
>do this easily. I would have expected this to be invoked in the destroy()
>method of WMServlet but this is not the case:-
> public synchronized void destroy ()
> {
> stop();
> _log.notice("stopped: " + this);
> _wm = null;
> _started = false;
> super.destroy();
> }
>
>In the end, I found it very hard to find a way to cleanly persuade the
>webmacro instance to shut itself down properly, and ended up putting
>something like this in my stop() method for my subclass of WMServlet:-
>
> protected void stop()
> {
> // tidy up my stuff... <snip>
> Broker broker = getBroker();
> try {
> Provider templateProvider = broker.getProvider("template");
> templateProvider.destroy();
> Provider urlProvider = broker.getProvider("url");
> urlProvider.destroy();
> } catch (NotFoundException nfEx) {
> nfEx.printStackTrace();
> }
> super.stop();
> }
>
>Now this nicely tidies up the appropriate resources and when I reload this
>application lots of times the thread count stays consistent, my memory is
>much more under control and everything is a bit smoother.
>
>So, my question is:-
>
>Assuming that ReloadingCacheManager has to be destroy()ed correctly to get it
>to shut down, and assuming that the application author doesn't know which
>Providers are going to be implemented using a ReloadingCacheManager (as it is
>defined by the properties classes at runtime), then what would be the
>"correct" way of ensuring that the framework is correctly shut down?
>
>Previously there was a definition of WebMacro.destroy() that stated "Call this
>method when you are finished with WebMacro. If you don't call this method,
>the Broker and all of WebMacro's caches may not be properly shut down,
>potentially resulting in loss of data, and wasted memory. This method is
>called in the finalizer, but it is best to call it as soon as you know you
>are done with WebMacro.", but this has since been dropped from the package.
>
>My gut feeling is that there should be a destroy() method on the Broker that
>then invokes destroy() on all of the sub-components that it is maintaining
>references to, but I am not that familiar with the webmacro hierarchy...
>
>All tests have been run against 2.0b1, but the changelog to 2.0RC1 doesn't
>touch upon any of these changes as far as I can see.
>
>Alex
>
>[1]
>http://opensource2.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669
>
>
>
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642