--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegion.java 2019-11-06 20:19:16.789189533 +0100 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegion.java 2019-11-06 20:19:16.585187696 +0100 @@ -45,9 +45,11 @@ // any of its fields but only iterate over it. public class HeapRegion extends CompactibleSpace implements LiveRegionsProvider { - // static int GrainBytes; - static private CIntegerField grainBytesField; + private static AddressField bottomField; static private AddressField topField; + private static AddressField endField; + + static private CIntegerField grainBytesField; private static long typeFieldOffset; private static long pointerSize; @@ -64,8 +66,11 @@ static private synchronized void initialize(TypeDataBase db) { Type type = db.lookupType("HeapRegion"); - grainBytesField = type.getCIntegerField("GrainBytes"); + bottomField = type.getAddressField("_bottom"); topField = type.getAddressField("_top"); + endField = type.getAddressField("_end"); + + grainBytesField = type.getCIntegerField("GrainBytes"); typeFieldOffset = type.getField("_type").getOffset(); pointerSize = db.lookupType("HeapRegion*").getSize(); @@ -82,9 +87,9 @@ type = (HeapRegionType)VMObjectFactory.newObject(HeapRegionType.class, typeAddr); } - public Address top() { - return topField.getValue(addr); - } + public Address bottom() { return bottomField.getValue(addr); } + public Address top() { return topField.getValue(addr); } + public Address end() { return endField.getValue(addr); } @Override public List getLiveRegions() { @@ -93,12 +98,16 @@ return res; } - @Override + /** Returns a subregion of the space containing all the objects in + the space. */ + public MemRegion usedRegion() { + return new MemRegion(bottom(), end()); + } + public long used() { return top().minus(bottom()); } - @Override public long free() { return end().minus(top()); }