--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionTable.java 2017-12-31 13:28:11.920769160 +0900 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionTable.java 2017-12-31 13:28:11.605768927 +0900 @@ -134,11 +134,11 @@ super(addr); } - public HeapRegion getByAddress(Address addr) { - long biasedIndex = addr.asLongValue() >>> shiftBy(); + public HeapRegion getByAddress(Address target) { + Address arrayAddr = biasedBaseField.getValue(addr); + long biasedIndex = target.asLongValue() >>> shiftBy(); long offset = biasedIndex * HeapRegion.getPointerSize(); - Address result = (addr instanceof OopHandle) ? addr.addOffsetToAsOopHandle(offset) - : addr.addOffsetTo(offset); - return new HeapRegion(result); + Address regionAddr = arrayAddr.getAddressAt(offset); + return (HeapRegion)VMObjectFactory.newObject(HeapRegion.class, regionAddr); } }