[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