RFR: JDK-8151336: Root region scanning should be cancelled and disabled when the ConcurrentMarkThread::run_service() exits
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