This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-extensions-classloader-leak-detector.git
commit b265ba0eb6196de45a15240ffb89b08fbcd4adf9 Author: Chetan Mehrotra <[email protected]> AuthorDate: Mon Feb 10 12:42:45 2014 +0000 SLING-3359 - Classloader Leak Detector Console Tab adding some comments and also ensuring that PhantomReference are properly cleared git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1566596 13f79535-47bb-0310-9956-ffa450edef68 --- .../extensions/leakdetector/internal/LeakDetector.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/sling/extensions/leakdetector/internal/LeakDetector.java b/src/main/java/org/apache/sling/extensions/leakdetector/internal/LeakDetector.java index 38e4446..1cca04c 100644 --- a/src/main/java/org/apache/sling/extensions/leakdetector/internal/LeakDetector.java +++ b/src/main/java/org/apache/sling/extensions/leakdetector/internal/LeakDetector.java @@ -29,7 +29,10 @@ import org.slf4j.LoggerFactory; public class LeakDetector implements Runnable, BundleActivator { /** - * Set of PhantomReferences such that PhantomReference itself is not GC + * Set of PhantomReferences such that PhantomReference itself is not GC. + * While analyzing the Heap Dump it might appear that GC roots of such classloaders (suspected) + * points to LeakDetector. This happens because they are held here through PhantomReference + * and there normal GC has not been done. So consider that as false positive */ private final Set<Reference<?>> refs = Collections.synchronizedSet(new HashSet<Reference<?>>()); @@ -124,7 +127,10 @@ public class LeakDetector implements Runnable, BundleActivator { log.info("Shutting down reference collector for Classloader LeakDetector"); //Drain out the queue - while (queue.poll() != null); + BundleReference ref = null; + while ((ref = (BundleReference)queue.poll()) != null){ + removeBundle(ref); + } } private void removeBundle(BundleReference ref) { @@ -134,6 +140,7 @@ public class LeakDetector implements Runnable, BundleActivator { //bi cannot be null bi.decrementUsageCount(ref); refs.remove(ref); + ref.clear(); } log.info("Detected garbage collection of bundle [{}] - Classloader [{}]", bi, ref.classloaderInfo); @@ -240,6 +247,12 @@ public class LeakDetector implements Runnable, BundleActivator { private static class ClassloaderInfo implements Comparable<ClassloaderInfo> { final Long creationTime = System.currentTimeMillis(); + /** + * The hashCode might collide for two different classloaders but then + * we cannot keep a hard reference to Classloader reference. So at best + * we keep the systemHashCode and *assume* it is unqiue at least wrt + * classloader instances + */ final long systemHashCode; private ClassloaderInfo(ClassLoader cl) { -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
