RFR(M/L): 6484982: G1: process references during evacuation pauses

John Cuthbertson john.cuthbertson at oracle.com
Thu Jun 23 21:35:36 UTC 2011


Hi Everyone,

I would like to get a couple of volunteers to review the code changes 
for this CR - the webrev can be found at 
http://cr.openjdk.java.net/~johnc/6484982/webrev.0/

Summary:
G1 now contains 2 instances of the reference processor class - one for 
concurrent marking and the other for STW GCs (both full and incremental 
evacuation pauses). For evacuation pauses, during object scanning and 
RSet scanning I embed the STW reference processor into the OopClosures 
used to scan objects. This causes reference objects to be 'discovered' 
by the reference processor. Towards the end of the evacuation pause 
(just prior to retiring the the GC alloc regions) I have added the code 
to process these discovered reference objects, preserving (and copying) 
referent objects (and their reachable graphs) as appropriate. The code 
that does this makes extensive use of the existing copying oop closures 
and the G1ParScanThreadState structure (to handle to-space allocation).

The code changes also include a couple of fixes that were exposed by the 
reference processing:
  * In satbQueue.cpp, the routine 
SATBMarkQueueSet::par_iterate_closure_all_threads() was claiming all 
JavaThreads (giving them one parity value) but skipping the VMThread. In 
a subsequent call to Thread::possibly_parallel_oops_do, the Java threads 
were successfully claimed but the VMThread was not. This could cause the 
VMThread's handle area to be skipped during the root scanning.
  * There were a couple of assignments to the discovered field of 
Reference objects that were not guarded by _discovery_needs_barrier 
resulting in the G1 C++ write-barrier to dirty the card spanning the 
Reference object's discovered field. This was causing the card table 
verification (during card table clearing) to fail.
  * There were also a couple of assignments of NULL to the next field of 
Reference objects causing the same symptom.

Testing: The GC test suite (32/64 bit) (+UseG1GC, +UseG1GC 
+ExplicitGCInvokesConcurrent, +UseG1GC InitiatingHeapOccupancyPercent=5, 
+UseG1GC +ParallelRefProcEnabled), KitchenSink (48 hour runs with 
+UseG1GC, +UseG1GC +ExplicitGCInvokesConcurrent), OpenDS (+UseG1GC, 
+UseG1GC +ParallelRefProcEnabled), nsk GC and compiler tests, and jprt. 
Testing was conducted with the _is_alive_non_header field in the STW ref 
procssor both cleared and set (when cleared, more reference objects are 
'discovered').

Thanks,

JohnC



More information about the hotspot-gc-dev mailing list