You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Felix Meschberger (JIRA)" <ji...@apache.org> on 2014/02/10 15:04:19 UTC

[jira] [Commented] (FELIX-4424) ClassLoader leak in Http Service ServletContextManager

    [ https://issues.apache.org/jira/browse/FELIX-4424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13896573#comment-13896573 ] 

Felix Meschberger commented on FELIX-4424:
------------------------------------------

Wow ! Excellent catch, indeed !

We could use a WeakHashMap, though, instead of a regular HashMap. This way, we can cope for this.

{noformat}
Index: ServletContextManager.java
===================================================================
--- ServletContextManager.java	(Revision 1566626)
+++ ServletContextManager.java	(Arbeitskopie)
@@ -16,8 +16,8 @@
  */
 package org.apache.felix.http.base.internal.context;
 
-import java.util.HashMap;
 import java.util.Map;
+import java.util.WeakHashMap;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextAttributeListener;
@@ -39,7 +39,7 @@
         this.bundle = bundle;
         this.context = context;
         this.attributeListener = attributeListener;
-        this.contextMap = new HashMap<HttpContext, ExtServletContext>();
+        this.contextMap = new WeakHashMap<HttpContext, ExtServletContext>();
         this.sharedAttributes = sharedAttributes;
     }
 
{noformat}

> ClassLoader leak in Http Service ServletContextManager
> ------------------------------------------------------
>
>                 Key: FELIX-4424
>                 URL: https://issues.apache.org/jira/browse/FELIX-4424
>             Project: Felix
>          Issue Type: Bug
>          Components: HTTP Service
>            Reporter: Chetan Mehrotra
>
> While analyzing heap dump for classloader leaks using script [1] following possible leak was reported
> {noformat}
> 	com.day.crx.packmgr.impl.AuthHttpContext@0x124214d18
> 	 Following are few of the live paths found
> 	 Live path
> 		com.day.crx.packmgr.impl.AuthHttpContext@0x124214d18
> 		java.util.HashMap$Entry@0x12429db50
> 		[Ljava.util.HashMap$Entry;@0x1238f47b0
> 		java.util.HashMap@0x1238f4780
> 		org.apache.felix.http.base.internal.context.ServletContextManager@0x1238f4760 [*]
> 		org.apache.felix.http.base.internal.service.HttpServiceImpl@0x1238f45c0 [*]
> 		org.apache.felix.framework.ServiceRegistry$UsageCount@0x1238f45a8
> 		[Lorg.apache.felix.framework.ServiceRegistry$UsageCount;@0x129efb430
> 		java.util.HashMap$Entry@0x1235ee950
> 		[Ljava.util.HashMap$Entry;@0x1249e2b78
> 		java.util.HashMap@0x123484668
> 		org.apache.felix.framework.ServiceRegistry@0x12339c108
> 		org.apache.felix.framework.ServiceRegistrationImpl@0x126a7a3c8
> 		java.util.concurrent.atomic.AtomicReference@0x126a7a3b8
> 		org.apache.felix.scr.impl.manager.DelayedComponentManager@0x126a79ab8 [*]
> 		java.util.HashMap$Entry@0x126a9c3f0
> 		java.util.HashMap$Entry@0x1286ce7a0
> 		[Ljava.util.HashMap$Entry;@0x124884030
> 		java.util.HashMap@0x1238f1ce0
> 		org.apache.felix.scr.impl.ComponentRegistry@0x1236757f0 [*]
> 		org.apache.felix.scr.impl.BundleComponentActivator@0x127152bd0 [*]
> 		org.apache.felix.scr.impl.config.ImmediateComponentHolder@0x127153a08 [*]
> 		org.apache.felix.scr.impl.manager.DelayedComponentManager@0x127154398 [*]
> 		org.apache.felix.scr.impl.manager.DependencyManager@0x127154720 [*]
> {noformat}
> In our case the AuthHttpContext was being registered via the Whiteboard pattern. The dump shows that ServletContextManager [2] uses the HttpContext as key for the map however it is never removed. If our bundle would had used HttpService directly then internal map would have been GC upon bundle deactivation.
> In Felix HttpService is registered as a ServiceFactory however as all interactions with HttpService is done via Whiteboard bundle the HttpService is bound to Whiteboard bundle. So such HttpContext might remain for the lifetime of whiteboard bundle and hence cause classloader leak.
> [1] https://gist.github.com/chetanmeh/8860776
> [2] https://github.com/apache/felix/blob/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/context/ServletContextManager.java
> PS: The lines marked with [*] are objects which are from valid bundle and are maintaining hard reference to the objects from classloader which should have been GC



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)