/** Process any roots for which processing was delayed. */ @Inline public void processRoots() { logMessage(5, "processing delayed root objects"); while (!rootLocations.isEmpty()) { processRootEdge(rootLocations.pop()); } }
/** Finishing processing all GC work. This method iterates until all work queues are empty. */ @Inline public void completeTrace() { logMessage(4, "Processing GC in parallel"); if (!rootLocations.isEmpty()) { processRoots(); } logMessage(5, "processing gray objects"); assertMutatorRemsetsFlushed(); do { while (!values.isEmpty()) { ObjectReference v = values.pop(); scanObject(v); } processRememberedSets(); } while (!values.isEmpty()); assertMutatorRemsetsFlushed(); }
/** Flush the local buffers of all deques. */ public final void flush() { values.flushLocal(); rootLocations.flushLocal(); }
public void release() { values.reset(); rootLocations.reset(); }
/** * Report a root edge to be processed during GC. As the given reference may theoretically point to * an object required during root scanning, the caller has requested processing be delayed. * * @param slot The location containing the object reference to be traced. The object reference is * <i>NOT</i> an interior pointer. * @param root True if <code>objLoc</code> is within a root. */ @Inline public final void reportDelayedRootEdge(Address slot) { rootLocations.push(slot); }