} while (markStack.isOverflow() || wb.isChanged());
if (writeBarrier != null) { wbChanged = writeBarrier.isChanged(); } } while (markStack.isOverflow() || wbChanged);
    private final void markHeap(VmBootHeap bootHeap, VmAbstractHeap firstHeap) {        final long startTime = VmSystem.currentKernelMillis();        long markedObjects = 0;        boolean firstIteration = true;        do {            // Do an iteration reset            markStack.reset();            wb.resetChanged();            markVisitor.reset();            markVisitor.setRootSet(true);            statics.walk(markVisitor, resolver);            // Mark every object in the rootset            bootHeap.walk(markVisitor);            if (!firstIteration) {                // If there was an overflow in the last iteration,                // we must also walk through the other heap to visit                // all grey objects, since we must still mark                // their children.                markVisitor.setRootSet(false);                VmAbstractHeap heap = firstHeap;                while ((heap != null) && (!markStack.isOverflow())) {                    heap.walk(markVisitor);                    heap = heap.getNext();                }            }            // Test for an endless loop            if ((markVisitor.getMarkedObjects() == 0) && markStack.isOverflow()) {                // Oops... an endless loop                Unsafe.debug("Endless loop in markHeap.... going to die");                helper.die("GCManager.markHeap");            }            // Do some cleanup            markedObjects += markVisitor.getMarkedObjects();            firstIteration = false;        } while (markStack.isOverflow() || wb.isChanged());        final long endTime = VmSystem.currentKernelMillis();        stats.lastMarkDuration = endTime - startTime;        stats.lastMarkedObjects = markedObjects;    }