John Trimble (JIRA)
Wed, 20 Jan 2010 16:47:29 -0800
When a bundle registered with Pax Web is uninstalled, references to that bundle's objects are not properly cleaned up causing a memory leak. --------------------------------------------------------------------------------------------------------------------------------------------
Key: PAXWEB-191
URL: http://issues.ops4j.org/browse/PAXWEB-191
Project: Pax Web
Issue Type: Bug
Components: Http Service, War Extender, Web Container
Affects Versions: 0.7.2
Environment: Apache Felix Karaf 1.2.0 and Pax Web 0.7.2
Reporter: John Trimble
Assignee: Alin Dreghiciu
Attachments: bundle_uninstallation_leak_fix.patch, memoryhogwebapp.zip
Pax Web continues to hold object references to uninstalled bundles that had
registered with the Pax Web WebContainer service or were extended by the Pax
Web War Extender. This causes a memory leak leading to permanent generation and
heap space issues if bundles, which interact with Pax Web in the aforementioned
ways, are routinely installed and uninstalled.
With regard to the WebContainer service, instances of
org.ops4j.pax.web.service.internal.HttpServiceStarted are never garbage
collected once instantiated and potentially continue to hold references to
various objects from uninstalled bundles, such as ServletContextListener
instances, if they were not explicitly unregistered. The cause of this is that
newly instantiated instances of HttpServiceStarted add a ServerListener
instance, implemented as an anonymous inner class of HttpServiceStarted, to the
ServerController, but never remove it. This listener holds an implicit
reference to the HttpServiceStarted instance preventing its garbage collection,
and the garbage collection of anything it references.
The Pax Web War Extender's WebXmlObserver holds references to instances of
org.ops4j.pax.web.extender.war.internal.model.WebApp even after the associated
WAR has been uninstalled. This leads to the same issue regarding permanent
generation and heap space.
I've attached a patch that should plug both of these leaks. First, it adds the
ability to remove ServerListener instances from a ServerController, and
modifies the HttpServiceStarted's stop() method to remove the appropriate
ServerListener instance from the ServerController. Secondly, it modifies the
WebXmlObserver's removingEntries() method to remove the appropriate WebApp
reference.
In addition to the patch, I've included a small example webapp to help
illustrate the problem. Simply install and uninstall the WAR serveral times,
allowing the Pax Web War Extender to extend it, and an OutOfMemory exception
will soon follow. If you examine the heap space, using a tool like YourKit, you
will find outstanding references to MemoryHogServletContextListener instances,
as well as extraneous WebApp and HttpServiceStarted instances.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.ops4j.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
_______________________________________________
general mailing list
general@lists.ops4j.org
http://lists.ops4j.org/mailman/listinfo/general