[jboss-cvs] JBossAS SVN: r61273 - trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sun Mar 11 20:31:31 EDT 2007


Author: bstansberry at jboss.com
Date: 2007-03-11 20:31:31 -0400 (Sun, 11 Mar 2007)
New Revision: 61273

Modified:
   trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/LeakAnalyzer.java
   trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/ReferenceReportNode.java
Log:
Sync to Branch_4_2

Modified: trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/LeakAnalyzer.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/LeakAnalyzer.java	2007-03-12 00:28:28 UTC (rev 61272)
+++ trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/LeakAnalyzer.java	2007-03-12 00:31:31 UTC (rev 61273)
@@ -76,15 +76,15 @@
       {
          exploreObject(root, thatObject, 0, maxLevel, useToString, false, referencesMap, new HashSet(), prunableLeaves);
 
-         if (condensed)
+         for (Iterator<ReferenceReportNode> it = prunableLeaves.iterator(); it.hasNext();)
          {
-            for (Iterator<ReferenceReportNode> it = prunableLeaves.iterator(); it.hasNext();)
-            {
-               it.next().removeBranch();
-            }
+            ReferenceReportNode nonCrit = it.next();
+            nonCrit.markNonCritical();
+            if (condensed)
+               nonCrit.removeBranch();
          }
 
-         writeReport(root, out);
+         writeReport(root, 0, out);
       }
       catch (Exception e)
       {
@@ -100,20 +100,9 @@
    private void exploreObject(ReferenceReportNode node, Object source, int currentLevel, final int maxLevel,
          boolean useToString, boolean weakAndSoft, Map mapDataPoints, Set alreadyExplored, Set prunableLeaves)
    {
-      String level = null;
-      {
-         StringBuffer levelStr = new StringBuffer();
-         for (int i = 0; i <= currentLevel; i++)
-         {
-            levelStr.append("!--");
-         }
-         level = levelStr.toString();
-      }
-
       if (maxLevel >= 0 && currentLevel >= maxLevel)
       {
-         ReferenceReportNode child = new ReferenceReportNode(level + "<b>MaxLevel</b>)");
-         node.addChild(child);
+         node.setMessage("<i>MaxLevel</i>)");
          return;
       }
 
@@ -124,18 +113,17 @@
          String message = null;
          if (source instanceof Class)
          {
-            message = level + " object instanceOf " + source + "@" + index
+            message = " object instanceOf " + source + "@" + index
                   + " was already described before on this report";
          }
          else
          {
-            message = level + " object instanceOf " + source.getClass() + "@" + index
+            message = " object instanceOf " + source.getClass() + "@" + index
                   + " was already described before on this report";
          }
 
-         ReferenceReportNode child = new ReferenceReportNode(message);
-         node.addChild(child);
-         prunableLeaves.add(child);
+         node.setMessage(message);
+         prunableLeaves.add(node);
          return;
       }
 
@@ -152,22 +140,31 @@
 
       log.info("References found");
 
-      Iterator iter = listPoints.iterator();
-
-      while (iter.hasNext())
+      for (Iterator iter = listPoints.iterator(); iter.hasNext();)
       {
          ReferenceDataPoint point = (ReferenceDataPoint) iter.next();
          
          ReferenceReportNode child = new ReferenceReportNode();
          
-         Object nextReference = treatReference(level, node, point, useToString);
+         Object nextReference = treatReference(child, point, useToString);
 
          if (nextReference != null && !weakAndSoft)
          {
             if (nextReference instanceof WeakReference || nextReference instanceof SoftReference)
             {
+               // WeakHashMap$Entry and ThreadLocal$ThreadLocalMap$Entry are
+               // special cases, where the Entry key is a weak ref, but the 
+               // value is strong. We don't want to ignore similar cases. So
+               // only mark as prunable if the ref is the standard
+               // java.lang.ref.Referent.referent -- all others are potential
+               // strong references
+               String msg = child.getMessage();
+               if (msg.indexOf("java.lang.ref.Reference.referent=") >= 0)
+               {
+                  prunableLeaves.add(child);
+               }
+               
                nextReference = null;
-               prunableLeaves.add(child);
             }
          }
 
@@ -176,18 +173,40 @@
             exploreObject(child, nextReference, currentLevel + 1, maxLevel, useToString, weakAndSoft, mapDataPoints,
                   alreadyExplored, prunableLeaves);
          }
+         
+         if (child.getMessage() != null || child.getChildren().size() > 0)
+            node.addChild(child);
+            
       }
 
    }
 
-   private void writeReport(ReferenceReportNode node, PrintWriter out)
+   private void writeReport(ReferenceReportNode node, int level, PrintWriter out)
    {
-      out.println("<br>");
-      out.print(node.getMessage());
+      out.print("<br>");
+      out.print(writeLevel(level));
+      if (node.isCritical())
+      {
+         out.print("<b>");
+         if (node.isLeaf())
+         {
+            out.print("<font color=\"red\">");
+         }         
+         out.print(node.getMessage());  
+         if (node.isLeaf())
+         {
+            out.print("</font>");
+         }
+         out.println("</b>");
+      }
+      else
+      {
+         out.println(node.getMessage());
+      }
 
       for (Iterator<ReferenceReportNode> it = node.getChildren().iterator(); it.hasNext();)
       {
-         writeReport(it.next(), out);
+         writeReport(it.next(), level + 1, out);
       }
    }
 
@@ -226,7 +245,7 @@
       }
    }
 
-   private Object treatReference(String level, ReferenceReportNode node, ReferenceDataPoint point, boolean useToString)
+   private Object treatReference(ReferenceReportNode node, ReferenceDataPoint point, boolean useToString)
    {
       Object referenceHolder = null;
       if (point.getReferenceHolder() == 0 || point.getReferenceHolder() == -1)
@@ -246,7 +265,7 @@
       {
          case JVMTICallBack.JVMTI_REFERENCE_CLASS :
             // Reference from an object to its class.
-            out.print(level + "InstanceOfReference:");
+            out.print("InstanceOfReference:");
             out.println("ToString=" + callToString(referenceHolder, useToString));
 
             nextReference = referenceHolder;
@@ -288,7 +307,7 @@
                   fieldName = field.toString();
                }
             }
-            out.print(level + " FieldReference " + fieldName + "=" + callToString(referenceHolder, useToString));
+            out.print("FieldReference " + fieldName + "=" + callToString(referenceHolder, useToString));
             nextReference = referenceHolder;
             break;
          }
@@ -299,34 +318,33 @@
             
             if (referenceHolder == null)
             {
-               out.println(level + " arrayRef Position " + point.getIndex() + " is gone");
+               out.println("arrayRef Position " + point.getIndex() + " is gone");
             }
             else
             {
-               out.println(level + " arrayRef " + referenceHolder.getClass().getName() + "[" + point.getIndex()
+               out.println("arrayRef " + referenceHolder.getClass().getName() + "[" + point.getIndex()
                      + "] id=@" + System.identityHashCode(referenceHolder));
             }
             nextReference = referenceHolder;
             break;
          case JVMTICallBack.JVMTI_REFERENCE_CLASS_LOADER :
-            // Reference from a class to its class loader.
-            
-            out.println(level + "ClassLoaderReference @ " + callToString(referenceHolder, useToString));
+            // Reference from a class to its class loader.            
+            out.println("ClassLoaderReference @ " + callToString(referenceHolder, useToString));
             nextReference = referenceHolder;
             break;
          case JVMTICallBack.JVMTI_REFERENCE_SIGNERS :
             // Reference from a class to its signers array.
-            out.println(level + "ReferenceSigner@" + callToString(referenceHolder, useToString));
+            out.println("ReferenceSigner@" + callToString(referenceHolder, useToString));
             nextReference = referenceHolder;
             break;
          case JVMTICallBack.JVMTI_REFERENCE_PROTECTION_DOMAIN :
             // Reference from a class to its protection domain.
-            out.println(level + "ProtectionDomain@" + callToString(referenceHolder, useToString));
+            out.println("ProtectionDomain@" + callToString(referenceHolder, useToString));
             nextReference = referenceHolder;
             break;
          case JVMTICallBack.JVMTI_REFERENCE_INTERFACE :
             // Reference from a class to one of its interfaces.
-            out.println(level + "ReferenceInterface@" + callToString(referenceHolder, useToString));
+            out.println("ReferenceInterface@" + callToString(referenceHolder, useToString));
             nextReference = referenceHolder;
             break;
          case JVMTICallBack.JVMTI_REFERENCE_STATIC_FIELD :// Reference from a
@@ -364,38 +382,25 @@
             {
                fieldName = field.toString();
             }
-            out.println(level + " StaticFieldReference " + fieldName);
+            out.println("StaticFieldReference " + fieldName);
             nextReference = null;
             break;
          }
-         case JVMTICallBack.JVMTI_REFERENCE_CONSTANT_POOL :// Reference from a
-                                                            // class to a
-                                                            // resolved entry in
-                                                            // the constant
-                                                            // pool. For
-                                                            // references of
-                                                            // this kind the
-                                                            // referrer_index
-                                                            // parameter to the
-                                                            // jvmtiObjectReferenceCallback
-                                                            // is the index into
-                                                            // constant pool
-                                                            // table of the
-                                                            // class, starting
-                                                            // at 1. See The
-                                                            // Constant Pool in
-                                                            // the Java Virtual
-                                                            // Machine
-                                                            // Specification.
-            out.println(level + "ReferenceInterface@" + callToString(referenceHolder, useToString));
+         case JVMTICallBack.JVMTI_REFERENCE_CONSTANT_POOL :
+            // Reference from a class to a resolved entry in
+            // the constant pool. For references of this kind the
+            // referrer_index parameter to the jvmtiObjectReferenceCallback
+            // is the index into constant pool table of the class, starting
+            // at 1. See The Constant Pool in the Java Virtual Machine
+            // Specification.
+            out.println(" ReferenceInterface@" + callToString(referenceHolder, useToString));
             nextReference = referenceHolder;
             break;
          case JVMTICallBack.ROOT_REFERENCE :
-            out.println(level + "Root");
+            out.println("Root");
             nextReference = null;
             break;
          case JVMTICallBack.THREAD_REFERENCE :
-            ;
 
             Class methodClass = this.getMethodClass(point.getMethod());
             if (methodClass != null)
@@ -415,7 +420,7 @@
                 */
 
                String methodName = this.getMethodName(point.getMethod());
-               out.println(level + " Reference inside a method - " + className + "::" + methodName);
+               out.println("Reference inside a method - " + className + "::" + methodName);
             }
             nextReference = null;
             break;
@@ -423,8 +428,20 @@
             log.warn("unexpected reference " + point);
       }
 
-      node.setMessage(charArray.toString());
+      String msg = charArray.toString();
+      if (msg.trim().length() > 0)
+         node.setMessage(msg);
 
       return nextReference;
    }
+   
+   private static String writeLevel(int level)
+   {
+      StringBuffer levelSb = new StringBuffer();
+      for (int i = 0; i <= level; i++)
+      {
+         levelSb.append("!--");
+      }
+      return levelSb.toString();
+   }
 }

Modified: trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/ReferenceReportNode.java
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/ReferenceReportNode.java	2007-03-12 00:28:28 UTC (rev 61272)
+++ trunk/testsuite/src/main/org/jboss/test/classloader/leak/clstore/ReferenceReportNode.java	2007-03-12 00:31:31 UTC (rev 61273)
@@ -37,6 +37,8 @@
    private String message;
    private List<ReferenceReportNode> children = new ArrayList<ReferenceReportNode>();; 
    private ReferenceReportNode parent;
+   private Boolean critical = Boolean.TRUE;
+   private int nonCriticalChildren = 0;
    
    public ReferenceReportNode()
    {      
@@ -51,6 +53,7 @@
    {
       children.add(child);
       child.setParent(this);
+      critical = null;
    }
    
    public void removeBranch()  
@@ -66,6 +69,34 @@
           removeBranch();
    }
    
+   public boolean isLeaf()
+   {
+      return children.size() == 0;
+   }
+   
+   public boolean isCritical()
+   {
+      if (critical != null)
+      {
+         return critical.booleanValue();
+      }
+      return (children.size() - nonCriticalChildren > 0); 
+   }
+   
+   public void markNonCritical()
+   {
+      critical = Boolean.FALSE;
+      if (parent != null)
+         parent.markChildNonCritical();
+   }
+   
+   private void markChildNonCritical()
+   {
+      nonCriticalChildren++;
+      if (!isCritical() && parent != null)
+         parent.markChildNonCritical();
+   }
+   
    public List<ReferenceReportNode> getChildren()
    {
       return Collections.unmodifiableList(children);




More information about the jboss-cvs-commits mailing list