--- old/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/MarkBits.java 2019-02-11 13:25:51.979170431 +0100 +++ new/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/MarkBits.java 2019-02-11 13:25:51.439170449 +0100 @@ -41,8 +41,7 @@ start = reserved.start(); end = reserved.end(); long numOopHandles = end.minus(start) / VM.getVM().getOopSize(); - // FIXME: will have trouble with larger heap sizes - bits = new BitMap((int) numOopHandles); + bits = heap.createBitMap(numOopHandles); } public void clear() { @@ -60,34 +59,22 @@ } OopHandle handle = obj.getHandle(); - // FIXME: will have trouble with larger heap sizes long idx = handle.minus(start) / VM.getVM().getOopSize(); - if ((idx < 0) || (idx >= bits.size())) { - System.err.println("MarkBits: WARNING: object " + handle + " outside of heap, ignoring"); - return false; - } - int intIdx = (int) idx; - if (bits.at(intIdx)) { + if (bits.at(idx)) { return false; // already marked } - bits.atPut(intIdx, true); + bits.atPut(idx, true); return true; } /** Forces clearing of a given mark bit. */ public void clear(Oop obj) { OopHandle handle = obj.getHandle(); - // FIXME: will have trouble with larger heap sizes long idx = handle.minus(start) / VM.getVM().getOopSize(); - if ((idx < 0) || (idx >= bits.size())) { - System.err.println("MarkBits: WARNING: object " + handle + " outside of heap, ignoring"); - return; - } - int intIdx = (int) idx; - bits.atPut(intIdx, false); + bits.atPut(idx, false); } - private BitMap bits; + private BitMapInterface bits; private Address start; private Address end; }