提交 87a46b4e 编写于 作者: M martin

6731726: jmap -permstat reports only 50-60% of permgen memory usage.

Reviewed-by: swamyv, martin
Contributed-by: yamauchi@google.com
上级 274b6a88
......@@ -266,46 +266,52 @@ public class PermStat extends Tool {
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();
}
// 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;
// Interfaces
size += arraySize(k.getLocalInterfaces());
size += arraySize(k.getTransitiveInterfaces());
// add inner classes size
TypeArray innerClasses = k.getInnerClasses();
size += innerClasses.getObjectSize();
// Inner classes
size += objectSize(k.getInnerClasses());
// add fields size
size += k.getFields().getObjectSize();
// Fields
size += objectSize(k.getFields());
// add methods size
// Methods
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();
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());
}
}
// MethodOrdering - an int array that records the original
// ordering of methods in the class file
size += arraySize(k.getMethodOrdering());
return size;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册