/** * Process GC work until either complete or workLimit units of work are completed. * * @param workLimit The maximum units of work to perform. * @return True if all work was completed within workLimit. */ @Inline public boolean incrementalTrace(int workLimit) { logMessage(4, "Continuing GC in parallel (incremental)"); logMessage(5, "processing gray objects"); int units = 0; do { while (!values.isEmpty() && units < workLimit) { ObjectReference v = values.pop(); scanObject(v); units++; } } while (!values.isEmpty() && units < workLimit); return values.isEmpty(); }
/** 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(); }
@Inline public final boolean isEmpty() { return values.isEmpty(); }