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? Certainly we can push this change to hotspot-svc. I doubt there is concurrent ongoing work in PermStat.java. Who is the hotspot-svc gatekeeper? 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 >> >