--- old/agent/src/share/classes/sun/jvm/hotspot/memory/GenCollectedHeap.java 2014-10-22 15:08:47.000000000 +0200 +++ new/agent/src/share/classes/sun/jvm/hotspot/memory/GenCollectedHeap.java 2014-10-22 15:08:47.000000000 +0200 @@ -35,8 +35,7 @@ public class GenCollectedHeap extends SharedHeap { private static CIntegerField nGensField; - private static AddressField youngGenField; - private static AddressField oldGenField; + private static long gensOffset; private static AddressField genSpecsField; private static GenerationFactory genFactory; @@ -53,8 +52,7 @@ Type type = db.lookupType("GenCollectedHeap"); nGensField = type.getCIntegerField("_n_gens"); - youngGenField = type.getAddressField("_young_gen"); - oldGenField = type.getAddressField("_old_gen"); + gensOffset = type.getField("_gens").getOffset(); genSpecsField = type.getAddressField("_gen_specs"); genFactory = new GenerationFactory(); @@ -74,15 +72,14 @@ " out of range (should be between 0 and " + nGens() + ")"); } - switch (i) { - case 0: - return genFactory.newObject(youngGenField.getAddress()); - case 1: - return genFactory.newObject(oldGenField.getAddress()); - default: - // no generation for i, and assertions disabled. + if ((i < 0) || (i >= nGens())) { return null; } + + Address genAddr = addr.getAddressAt(gensOffset + + (i * VM.getVM().getAddressSize())); + return genFactory.newObject(addr.getAddressAt(gensOffset + + (i * VM.getVM().getAddressSize()))); } public boolean isIn(Address a) {