RFR (S): JDK-8046518: G1: Double calls to register_concurrent_cycle_end()

Bengt Rutisson bengt.rutisson at oracle.com
Wed Jun 11 10:33:01 UTC 2014


Hi all,

Can I have a review for this change?

http://cr.openjdk.java.net/~brutisso/8046518/webrev.00/

https://bugs.openjdk.java.net/browse/JDK-8046518

Background:
When we abort a concurrent cycle due to a Full GC in G1 we call 
ConcurrentMark::abort(). That will set _has_aborted flag and then call 
register_concurrent_cycle_end().

The concurrent marking thread will see the _has_aborted flag in its 
ConcurrentMarkThread::run() method, abort the execution and then call 
register_concurrent_cycle_end().

Currently this works since the code inside 
register_concurrent_cycle_end() is guarded by _concurrent_cycle_started 
which it then resets. So, the double calls will not necessarily result 
in too much extra work being done. But one of the things that 
register_concurrent_cycle_end() does is to call report_gc_end() on the 
concurrent GC tracer. That prevents further use of it for this GC. This 
means that inside the ConcurrentMarkThread::run() method we can not rely 
on the tracer.

Removing the call to register_concurrent_cycle_end() in 
ConcurrentMark::abort() and relying on the call in 
ConcurrentMarkThread::run() seems to be a reasonable approach.

Thanks,
Bengt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20140611/79f0c88a/attachment.htm>


More information about the hotspot-gc-dev mailing list