RFR: Traversal: Don't traverse new objects
Aleksey Shipilev
shade at redhat.com
Tue Feb 6 20:46:23 UTC 2018
On 02/05/2018 12:16 PM, Roman Kennke wrote:
> With Traversal GC I'm currently observing final-pauses of several dozen (e.g. ~70) ms. Turns out
> that almost all of it is just traversing just-allocated objects. It occurs to me that this is
> pointless work: we're not going to evacuate any new object during this cycle, and liveness
> information may not be that useful either into next cycle because it usually degenerates quickly
> (for new stuff). Let's not traverse new-alloc-regions, and don't count liveness there, which means
> it's going to end up in next cycle's cset (just like the alloc-regions between cycles). This cuts
> pauses down to 3-4ms. Yay!
>
> Notice that this is safe because new objects don't point to anything, and any ref stored into new
> objects during the pause get picked up by the enqueing barrier for I-U.
>
> Notice that we *do* need to traverse and account evac-regions, because they have references pointing
> to interesting stuff. Hence the disctinction for is_alloc_region() (better ideas welcome!).
>
> Also notice that this opens up an interesting opportunity for optimizing the enqueue-barrier: we
> could now elide ENQBs on objects known to be new. (In addition to known-NULL, which we already
> check, and already-enqueued, which we don't do yet. We could also do pretty much what we do with WBs
> and RBs and hoist them out of loops, etc. Lots of work to do there, and opportunities for
> improvements).
>
> http://cr.openjdk.java.net/~rkennke/traversal-no-traverse-new/webrev.00/
I need more time to understand the logic of this patch. It is seriously weird to see next-TAMS setup
in ShenandoahFreeSet::try_allocate_in, which is on generic allocation path which also should work
for non-Traversal GC modes.
The patch fails at least AllocHumongousFragment with:
# assert(!_heap->is_marked_next(oop(humongous_obj))) failed: must not be marked
Other comments:
*) So wait, this means alloc-regions are not the candidates for immediate reclamation now?
546 if (r->is_humongous_start() && !r->has_live() && !r->is_alloc_region()) {
*) Same for regular trashing?
556 } else if (!r->is_empty() && !r->has_live() && !r->is_alloc_region()) {
*) Excess parentheses:
shenandoahTraversalGC.cpp:
73 if ((!_heap->is_marked_next(obj)) && _heap->mark_next(obj)) {
shenandoahTraversalGC.inline.hpp:
54 if ((!_heap->is_marked_next(obj)) && _heap->mark_next(obj)) {
*) Comment is obsolete.
981 _verify_liveness_disable, // liveness data must be complete here
-Aleksey
More information about the shenandoah-dev
mailing list