Improve root set used by hat
Kelly O'Hair
Kelly.Ohair at Sun.COM
Thu Oct 8 20:25:41 PDT 2009
I'll test this change:
diff --git a/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java
b/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java
--- a/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java
+++ b/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java
@@ -57,7 +57,10 @@ public class JavaStatic {
id = ((JavaObjectRef)value).getId();
}
value = value.dereference(snapshot, field);
- if (value.isHeapAllocated()) {
+ if (value.isHeapAllocated() &&
+ clazz.getLoader() == snapshot.getNullThing()) {
+ // static fields are only roots if they are in classes
+ // loaded by the root classloader.
JavaHeapObject ho = (JavaHeapObject) value;
String s = "Static reference from " + clazz.getName()
+ "." + field.getName();
Let me know if that seems right.
Unfortunately,
we haven't many jhat tests, did you have any small testcase scenarios?
The few tests for jhat are at jdk/tests/sun/tools/jhat, I can help craft one
if you give me something to start with.
-kto
Keith Randall wrote:
> Here's a simpler patch that never makes Roots for these static fields in
> the first place:
>
> --- com/sun/tools/hat/internal/model/JavaStatic.java
> ***************
> *** 57,64 ****
> id = ((JavaObjectRef)value).getId();
> }
> value = value.dereference(snapshot, field);
> ! if (value.isHeapAllocated() &&
> ! clazz.getLoader() == snapshot.getNullThing()) { // static
> fields are only roots if they are in classes loaded by the root classloader.
> JavaHeapObject ho = (JavaHeapObject) value;
> String s = "Static reference from " + clazz.getName()
> + "." + field.getName();
> --- 57,63 ----
> id = ((JavaObjectRef)value).getId();
> }
> value = value.dereference(snapshot, field);
> ! if (value.isHeapAllocated()) {
> JavaHeapObject ho = (JavaHeapObject) value;
> String s = "Static reference from " + clazz.getName()
> + "." + field.getName();
>
>
> On Wed, Oct 7, 2009 at 1:49 AM, Alan Bateman <Alan.Bateman at sun.com
> <mailto:Alan.Bateman at sun.com>> wrote:
>
> A. Sundararajan wrote:
>
> I agree. Static fields of classes loaded by non-bootstrap
> loaders should not be part of root set.
>
> PS. I am not sure if this is a bug with hat or with heap
> dumpers (the hotspot built-in dumper and SA's dumper). I don't
> remember how "roots" is filled. May be, these static fields
> should not be flagged as roots?
>
> -Sundar
>
> At least for the built-in heap dumper, static fields aren't
> generated as roots (instead it's system classes and temporary
> placeholders in the dictionary that are generated to the dump as
> "sticky classes", to use a HPROF term). So I suspect this is more
> likely to be a jhat issue.
>
> -Alan.
>
>
More information about the serviceability-dev
mailing list