Need reviewer: jmap -permstat
Martin Buchholz
martinrb at google.com
Tue Jul 29 17:58:00 PDT 2008
On Tue, Jul 29, 2008 at 3:51 PM, Daniel D. Daugherty
<Daniel.Daugherty at sun.com> 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
>>
>
More information about the serviceability-dev
mailing list