comparison agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java @ 261:7f601f7c9b48

6731726: jmap -permstat reports only 50-60% of permgen memory usage. Reviewed-by: swamyv, martin Contributed-by: yamauchi@google.com
author martin
date Thu, 31 Jul 2008 18:50:37 -0700
parents a61af66fc99e
children 9ee9cf798b59
comparison
equal deleted inserted replaced
259:c7e8144ef65e 261:7f601f7c9b48
264 out.print('\t'); 264 out.print('\t');
265 out.print(" N/A "); 265 out.print(" N/A ");
266 out.println(); 266 out.println();
267 } 267 }
268 268
269 private static long objectSize(Oop oop) {
270 return oop == null ? 0L : oop.getObjectSize();
271 }
272
273 // Don't count the shared empty arrays
274 private static long arraySize(Array arr) {
275 return arr.getLength() != 0L ? arr.getObjectSize() : 0L;
276 }
277
269 private long computeSize(InstanceKlass k) { 278 private long computeSize(InstanceKlass k) {
270 long size = 0L; 279 long size = 0L;
271 // InstanceKlass object size 280 // the InstanceKlass object itself
272 size += k.getObjectSize(); 281 size += k.getObjectSize();
273 282
274 // add ConstantPool size 283 // Constant pool
275 size += k.getConstants().getObjectSize(); 284 ConstantPool cp = k.getConstants();
276 285 size += cp.getObjectSize();
277 // add ConstantPoolCache, if any 286 size += objectSize(cp.getCache());
278 ConstantPoolCache cpCache = k.getConstants().getCache(); 287 size += objectSize(cp.getTags());
279 if (cpCache != null) { 288
280 size += cpCache.getObjectSize(); 289 // Interfaces
281 } 290 size += arraySize(k.getLocalInterfaces());
282 291 size += arraySize(k.getTransitiveInterfaces());
283 // add interfaces size 292
284 ObjArray interfaces = k.getLocalInterfaces(); 293 // Inner classes
285 size += (interfaces.getLength() != 0L)? interfaces.getObjectSize() : 0L; 294 size += objectSize(k.getInnerClasses());
286 ObjArray transitiveInterfaces = k.getTransitiveInterfaces(); 295
287 size += (transitiveInterfaces.getLength() != 0L)? transitiveInterfaces.getObjectSize() : 0L; 296 // Fields
288 297 size += objectSize(k.getFields());
289 // add inner classes size 298
290 TypeArray innerClasses = k.getInnerClasses(); 299 // Methods
291 size += innerClasses.getObjectSize();
292
293 // add fields size
294 size += k.getFields().getObjectSize();
295
296 // add methods size
297 ObjArray methods = k.getMethods(); 300 ObjArray methods = k.getMethods();
298 size += (methods.getLength() != 0L)? methods.getObjectSize() : 0L; 301 int nmethods = (int) methods.getLength();
299 TypeArray methodOrdering = k.getMethodOrdering(); 302 if (nmethods != 0L) {
300 size += (methodOrdering.getLength() != 0L)? methodOrdering.getObjectSize() : 0; 303 size += methods.getObjectSize();
301 304 for (int i = 0; i < nmethods; ++i) {
302 // add each method's size 305 Method m = (Method) methods.getObjAt(i);
303 int numMethods = (int) methods.getLength(); 306 size += m.getObjectSize();
304 for (int i = 0; i < numMethods; i++) { 307 size += objectSize(m.getConstMethod());
305 Method m = (Method) methods.getObjAt(i); 308 }
306 size += m.getObjectSize(); 309 }
307 } 310
311 // MethodOrdering - an int array that records the original
312 // ordering of methods in the class file
313 size += arraySize(k.getMethodOrdering());
308 314
309 return size; 315 return size;
310 } 316 }
311 } 317 }