Hey Martin,


Martin Buchholz wrote:
On Tue, Jul 29, 2008 at 3:51 PM, Daniel D. Daugherty
<[EMAIL PROTECTED]> wrote:
  
This patch should be done in the following repository:

  http://hg.openjdk.java.net/jdk7/hotspot-svc/hotspot
    

That's what we thought as well, but that forest had not been kept up to date.
But I now see that it has been recently updated.
Is that due to a recent change in procedure?
  

John Coomes periodically updates all the non-HotSpot repos in
the different forests that the HotSpot teams use. I think he
has been trying to do this once a week.

Certainly we can push this change to hotspot-svc.
I doubt there is concurrent ongoing work in PermStat.java.
  

Agreed, but the change should come up through the Serviceability
teams sub-baseline unless it is an urgent change.

Who is the hotspot-svc gatekeeper?
  

That would still be me.

Dan


Martin

  
Dan


Hiroshi Yamauchi wrote:
    
Hi,

I'd like to contribute this patch. I need a reviewer who is familiar
with the Hotspot Serviceability Agent.

The description of the patch is something like:

       Accounting for more memory uses associated with class metadata
       in PermGen which "jmap -permstat" misses.

In a small test, the "jmap -permstat" command reports only about
50-60% of the permgen memory usage (compared to the actual usage of
permgen based on what the "jmap" command reports). This patch will
increase the number up to 80-90%.

Martin Buchholz did an initial review for me and he is volunteering to
be the committer.

Here's the patch which is based on a very recent version of
http://hg.openjdk.java.net/jdk7/jdk7

--- a/agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java
@@ -266,45 +266,51 @@
      out.println();
   }

+   private static long objectSize(Oop oop) {
+      return oop == null ? 0L : oop.getObjectSize();
+   }
+
+   // Don't count the shared empty arrays
+   private static long arraySize(Array arr) {
+     return arr.getLength() != 0L ? arr.getObjectSize() : 0L;
+   }
+
   private long computeSize(InstanceKlass k) {
      long size = 0L;
-      // InstanceKlass object size
+      // the InstanceKlass object itself
      size += k.getObjectSize();

-      // add ConstantPool size
-      size += k.getConstants().getObjectSize();
+      // Constant pool
+      ConstantPool cp = k.getConstants();
+      size += cp.getObjectSize();
+      size += objectSize(cp.getCache());
+      size += objectSize(cp.getTags());

-      // add ConstantPoolCache, if any
-      ConstantPoolCache cpCache = k.getConstants().getCache();
-      if (cpCache != null) {
-         size += cpCache.getObjectSize();
+      // Interfaces
+      size += arraySize(k.getLocalInterfaces());
+      size += arraySize(k.getTransitiveInterfaces());
+
+      // Inner classes
+      size += objectSize(k.getInnerClasses());
+
+      // Fields
+      size += objectSize(k.getFields());
+
+      // Methods
+      ObjArray methods = k.getMethods();
+      int nmethods = (int) methods.getLength();
+      if (nmethods != 0L) {
+         size += methods.getObjectSize();
+         for (int i = 0; i < nmethods; ++i) {
+            Method m = (Method) methods.getObjAt(i);
+            size += m.getObjectSize();
+            size += objectSize(m.getConstMethod());
+         }
      }

-      // add interfaces size
-      ObjArray interfaces = k.getLocalInterfaces();
-      size +=  (interfaces.getLength() != 0L)? interfaces.getObjectSize()
: 0L;
-      ObjArray transitiveInterfaces = k.getTransitiveInterfaces();
-      size += (transitiveInterfaces.getLength() != 0L)?
transitiveInterfaces.getObjectSize() : 0L;
-
-      // add inner classes size
-      TypeArray innerClasses = k.getInnerClasses();
-      size += innerClasses.getObjectSize();
-
-      // add fields size
-      size += k.getFields().getObjectSize();
-
-      // add methods size
-      ObjArray methods = k.getMethods();
-      size += (methods.getLength() != 0L)? methods.getObjectSize() : 0L;
-      TypeArray methodOrdering = k.getMethodOrdering();
-      size += (methodOrdering.getLength() != 0L)?
methodOrdering.getObjectSize() : 0;
-
-      // add each method's size
-      int numMethods = (int) methods.getLength();
-      for (int i = 0; i < numMethods; i++) {
-         Method m = (Method) methods.getObjAt(i);
-         size += m.getObjectSize();
-      }
+      // MethodOrdering - an int array that records the original
+      // ordering of methods in the class file
+      size += arraySize(k.getMethodOrdering());

      return size;
   }

I'd appreciate it if someone at Sun can sponsor this.

Thanks,
Hiroshi

      

Reply via email to