RFR: Traveral GC heuristics

Roman Kennke rkennke at redhat.com
Tue Jan 23 17:23:49 UTC 2018



Am 23. Januar 2018 17:06:20 MEZ schrieb Aleksey Shipilev <shade at redhat.com>:
>On 01/22/2018 11:17 PM, Roman Kennke wrote:
>> - when growing the heap, we must make sure that the TAMS points to
>end for the new regions, 
>> otherwise we'd treat them implicitely marked.
>
>Is this the source of this spooky change?
>
>   inline ShenandoahHeapRegion* get(size_t i) const {
>-    assert (i < _active_end, "sanity");
>+    assert (i < _reserved_end, "sanity");
>     return _regions[i];
>   }
>
>get() is supposed to only return added regions. I think if you return
>something farther the
>_active_end, you read garbage.

I think all regions are initialized, but no memory allocated?


>> - folded 'SATB' queue processing into thread stack scanning. The
>problem here is that iterating 
>> the threads 2x is cumbersome because of the claiming protocol: we
>need to fire the task/workers
>> 2x: once for the SATB queues, once for the thread scanning. I folded
>it into one pass. This
>> required a (trivial) extension in the upstream parallel thread
>scanning/iteration protocol.
>
>So this is the source for extension of RootProcessor and Thread
>methods?

Yes.

> I am a bit uneasy about
>this (mostly because it raises backporting questions). I'd rather
>include this into RootProcessor
>right away, and assert nothing passes non-NULL ThreadClosure there.

OK, can break that out of the patch.

>Then, sh/jdk8u, sh/jdk9 and
>sh/jdk10 versions would agree on the shape of RootProcessor methods and
>the calls to it, while
>sh/jdk10 would call RootProcessor with non-NULL ThreadClosure, and it
>would *also* implement the
>relevant parts in Thread.

Makes sense.

>> - I tripped an assert in SHR::increase_live_data(). I think the
>reason is that we have a race 
>> here: a GC thread might not yet see the updated SHR::_top but already
>accounts for the updated 
>> live data. I excluded conc-traversal from that check. This could
>probably be fixed by doing the
>> proper concurrency membars, but do we care? For assertion code?
>
>But wait, this change means "s" is greater than max_jint on some paths
>during Traversal?!
>
> inline void ShenandoahHeapRegion::increase_live_data_words(size_t s) {
>-  assert (s <= (size_t)max_jint, "sanity");
>+  assert (s <= (size_t)max_jint ||
>_heap->is_concurrent_traversal_in_progress(), "sanity");
>   increase_live_data_words((int)s);
> }

Gah. No. Will fix it.

Stay tuned for updated patch.


>
>Also, I am confused where Traversal calls
>increase_live_data_words(size_t), because both call sites
>are already protected:
>
>    if (!sh->is_concurrent_traversal_in_progress()) {
>      r->increase_live_data_words(used_words);
>    }
>
>...
>
>  if (!ShenandoahHeap::heap()->is_concurrent_traversal_in_progress()) {
>      r->increase_live_data_words(word_size);
>    }
>
>> Full:
>> http://cr.openjdk.java.net/~rkennke/traversal/webrev.04/
>
>Since we have "adaptive" failures with C2 and/or -ShWBMemBar, I propose
>we chicken out, and drop all
>C2 changes (apart from the actual enqueue_barrier) from this change,
>then follow up on optimization
>story in subsequent changesets. This way we could integrated Traversal
>GC, and not risk immediate
>regression in non-Traversal code.
>
>This is done, along with other minor touchups here (apply over
>webrev.04):
>http://cr.openjdk.java.net/~shade/shenandoah/traversal-shade-updates-1.patch
>
>Thanks,
>-Aleksey

-- 
Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.


More information about the shenandoah-dev mailing list