RFR: JDK-8151336: Root region scanning should be cancelled and disabled when the ConcurrentMarkThread::run_service() exits (original) (raw)

Bengt Rutisson bengt.rutisson at oracle.com
Mon Mar 14 11:23:03 UTC 2016


Hi all,

Could I have a couple of reviews for this change?

http://cr.openjdk.java.net/~brutisso/8151336/webrev.00/ https://bugs.openjdk.java.net/browse/JDK-8151336

The run_service() loop in ConcurrentMarkThread looks like this:

while (!_should_terminate) { // wait until started is set. sleepBeforeNextCycle(); if (_should_terminate) { _cm->root_regions()->cancel_scan(); break; } // do all the work }

If a full GC is triggered while the ConcurrentMarkThread is in "do all the work" the full GC will wait for the root region scan. But if we at the same time decide to exit the VM we will set _should_terminate to true, which will cause the while() loop to not continue and we won't get to the cancel_scan call.

The proposed fix moves the call to cancel_scan() until after the while loop has exited. That way we will always cancel any pending root region scanning.

I also introduce a _has_terminated state for G1CMRootRegions to makes sure that another root region scanning can't be initialized once the CM thread has exited. This also called for a rename of cancel_scan() to terminate().

Thanks, Bengt



More information about the hotspot-gc-dev mailing list