RFR: 8189748: More precise closures for WeakProcessor::weak_oops_do calls
Stefan Karlsson
stefan.karlsson at oracle.com
Fri Oct 20 17:55:36 UTC 2017
Hi all,
Please review this patch to use more precise closures for the
WeakProcessor::weak_oops_do calls:
http://cr.openjdk.java.net/~stefank/8189748/webrev.00
https://bugs.openjdk.java.net/browse/JDK-8189748
------------------------------------------------------------------------
WeakProcessor::weak_oops_do takes three closures:
* is_alive - checks if the oop* points to an alive object
* keep_alive - applied to all oop*s that point to live objects. It's
typically used by the GC to update forwarded pointers to the to the new
copy of object. The marking GCs pass in a closure that marks objects and
pushes references to the marking stacks.
* complete - the intention is to use this closure to scan objects copied
by keep_alive, or mark through objects passed to the marking stacks.
However, much of this work is unnecessary and actually misleading.
The marking GCs should never find unmarked objects when the keep_alive
closure is applied. So, there's actually no need to apply the keep_alive
closure, and therefore also not necessary to apply the complete closure.
The proposal is to change these calls to:
WeakProcessor::weak_oops_do(is_alive, &do_nothing_cl);
The copying young GCs should never find objects that have not been
copied, only pointers that have not been forwarded to already copied
objects. Therefore, the complete closure isn't needed for these calls
either. As a first step we could change them to:
WeakProcessor::weak_oops_do(is_alive, keep_alive);
assert(verify that no objects where copied...)
The keep_alive closure is still needed to forward the pointers to the
copied objects, but later changes could change the keep_alive closure to
be more explicit and only do the forwarding.
------------------------------------------------------------------------
The patch uses and moves the DoNothingClosure to iterator.hpp.
------------------------------------------------------------------------
For ParallelScavenge the PSKeepAliveClosure has been changed to
PSScavengeRootsClosure. The latter is stricter and don't allow oop*s to
be visited twice. This is the closure used by the StringTable cleaning.
------------------------------------------------------------------------
Tested with hs-tier1, hs-tier2, hs-tier3.
Thanks,
StefanK
More information about the hotspot-gc-dev
mailing list