--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java 2018-11-26 21:28:24.040981855 +0100 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java 2018-11-26 21:28:23.886983214 +0100 @@ -36,6 +36,7 @@ import sun.jvm.hotspot.gc.shared.*; import sun.jvm.hotspot.gc.epsilon.*; import sun.jvm.hotspot.gc.g1.*; +import sun.jvm.hotspot.gc.shenandoah.*; import sun.jvm.hotspot.gc.parallel.*; import sun.jvm.hotspot.gc.z.*; import sun.jvm.hotspot.memory.*; @@ -245,13 +246,15 @@ } } + int cell_header_size = heap.cell_header_size(); + for (int i = 0; i < liveRegions.size(); i += 2) { Address bottom = (Address) liveRegions.get(i); Address top = (Address) liveRegions.get(i+1); try { // Traverses the space from bottom to top - OopHandle handle = bottom.addOffsetToAsOopHandle(0); + OopHandle handle = bottom.addOffsetToAsOopHandle(cell_header_size); while (handle.lessThan(top)) { Oop obj = null; @@ -288,7 +291,7 @@ if ( (cmsSpaceOld != null) && cmsSpaceOld.contains(handle)) { handle = handle.addOffsetToAsOopHandle(CompactibleFreeListSpace.adjustObjectSizeInBytes(obj.getObjectSize()) ); } else { - handle = handle.addOffsetToAsOopHandle(obj.getObjectSize()); + handle = handle.addOffsetToAsOopHandle(obj.getObjectSize() + cell_header_size); } } } @@ -367,6 +370,9 @@ } else if (heap instanceof G1CollectedHeap) { G1CollectedHeap g1h = (G1CollectedHeap) heap; g1h.heapRegionIterate(lrc); + } else if (heap instanceof ShenandoahHeap) { + ShenandoahHeap sh = (ShenandoahHeap) heap; + sh.heapRegionIterate(lrc); } else if (heap instanceof ZCollectedHeap) { // Operation (currently) not supported with ZGC. Print // a warning and leave the list of live regions empty.