Mercurial > hg > truffle
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 } |