RFR: 8139149: Split G1 evacuate_collection_set into multiple steps

Mikael Gerdin mikael.gerdin at oracle.com
Fri Oct 16 08:34:21 UTC 2015


Hi all,

I'd like to split up one of G1's main functions, 
evacuate_collection_set, into different steps.

I also add a hook to allow an implementor to add code for additional 
evacuation other than the standard collection set.

The actual change is not that large but it does introduce some 
re-orderings of operations which I will try to argue are correct:

* set_evacuation_failure_alot_for_current_gc is moved but its result is 
only accessed from copy_to_survivor_space which is still after where I 
put it.

* prepare_for_oops_into_collection_set_do is moved to below disabling 
the hot card cache, this should not be an issue since draining the hot 
card cache is done during updateRS which is a later phase.

* cleanup_after_oops_into_collection_set_do ends up before releasing of 
alloc regions but the alloc region release currently does not interact 
with card dirtying so it should be fine.

* removal of self forward pointers for evacuation failure and reference 
enqueue will end up occurring before
-> alloc region release
-> par scan thread state flushing
-> evac summary stats
-> hot card cache re-enable
-> code root memory purge
Both evacuation failure processing and reference enqueue should not 
perform any allocation, so alloc region release and summary stats should 
not be affected.

Both evacuation failure processing and reference enqueue does mutate the 
card table in order to restore remembered sets. This is the primary 
reason for them being forced to occur after 
cleanup_after_oops_into_collection_set_do which clears the entire card 
table.
Par scan thread state flushing does flush the dirty card buffers created 
during the collection to the collections dcq set but actually dirtying 
those cards in the card table is done during the redirty_logged_cards 
step which does not move in this change.

Moving the hot card cache re-enable should only affect cards refined 
during concurrent refinement after the current gc is completed.

The code root memory purge is independent of the other changes so it 
should not have any visible effect.

Please don't just take my word for this though, I might have missed 
something!


Webrev: http://cr.openjdk.java.net/~mgerdin/8139149/webrev.0/
Bug: https://bugs.openjdk.java.net/browse/JDK-8139149

Testing:
JPRT
RBT (Kitchensink, vm.gc.testlist, :hotspot_all jtreg tests)



More information about the hotspot-gc-dev mailing list