Aleksey,

I'm a bit out of touch with this code but just to say that the HPROF format is VM independent and the length that follows the class ID in the INSTANCE record is the size for the fields that follow.

-Alan

On 29/12/2012 09:14, Aleksey Shipilev wrote:
Hi guys,

This issue popped out (again?) in the course of @Contended work, which
does the padding around fields in some corner cases. HPROF just iterates
the fields to deduce the instance size, which can give a terribly wrong
instance size estimate.

I have filed CR 8005604 to track this.

FWIW, the fix appears to be very simple, we can reuse the instance size
data already available in instanceKlass, like this:

--- a/src/share/vm/services/heapDumper.cpp      Mon Dec 24 11:46:38 2012 -0800
+++ b/src/share/vm/services/heapDumper.cpp      Sat Dec 29 13:08:51 2012 +0400
@@ -772,33 +772,7 @@
  u4 DumperSupport::instance_size(Klass* k) {
    HandleMark hm;
    instanceKlassHandle ikh = instanceKlassHandle(Thread::current(), k);
-
-  int size = 0;
-
-  for (FieldStream fld(ikh, false, false); !fld.eos(); fld.next()) {
-    if (!fld.access_flags().is_static()) {
-      Symbol* sig = fld.signature();
-      switch (sig->byte_at(0)) {
-        case JVM_SIGNATURE_CLASS   :
-        case JVM_SIGNATURE_ARRAY   : size += oopSize; break;
-
-        case JVM_SIGNATURE_BYTE    :
-        case JVM_SIGNATURE_BOOLEAN : size += 1; break;
-
-        case JVM_SIGNATURE_CHAR    :
-        case JVM_SIGNATURE_SHORT   : size += 2; break;
-
-        case JVM_SIGNATURE_INT     :
-        case JVM_SIGNATURE_FLOAT   : size += 4; break;
-
-        case JVM_SIGNATURE_LONG    :
-        case JVM_SIGNATURE_DOUBLE  : size += 8; break;
-
-        default : ShouldNotReachHere();
-      }
-    }
-  }
-  return (u4)size;
+  return (u4)ikh->size_helper();
  }

  // dumps static fields of the given class


Please let me know if you have troubles with pushing this. If not, I can
get the proper due diligence to get this fixed.

Thanks,
Aleksey.

Reply via email to