RFR: Shenandoah Partial GC with generational/LRU policies

Christine Flood cflood at redhat.com
Tue Jul 25 18:51:45 UTC 2017


On Mon, Jul 24, 2017 at 4:07 PM, Roman Kennke <rkennke at redhat.com> wrote:

> Am 24.07.2017 um 20:45 schrieb Christine Flood:
>
> http://cr.openjdk.java.net/~chf/GenerationalPartialGC/webrev.01/
>
> I've made the changes Shade requested and passed all of the tests,
> including the suggested additions, with the exception
> of gc/shenandoah/ShenandoahJNICritical.java which is also broken in a clean
> build.
>
> Christine
>
> - ShenandoahHeuristics::_bytes_allocated_after_last_gc is unused now.
> Remove?
>
OK

> - I would find it nicer to make the compare_by_* private static members of
> ShenandoahHeuristics.
>
They can't be private because they are used by subclasses.  I want them to
be available for future policies.

> - I wonder if the is_in() check should be in the normal add_region() path.
> After all it's called *Set, I don't think we ever want duplicates, and
> is_in() is cheap now. ?
>
I don't think so.  I hate adding the extra checks where they aren't needed.

> - I don't really like all the timestamp stuff in ShenandoahHeap. Sounds
> like it should be in ShenandoahHeuristics or appropriate subclass?
>
Except it really is a part of all gcs, including full gcs, and therefore to
me it belongs in shenandoahheap.

Also, is_conc_gc_in_progress() should be easier to do using the existing
> *_in_progress() accessors somehow? E.g.:
>
> bool is_conc_gc_in_progress() {
>
>   return concurrent_mark_in_progress() || is_evacuation_in_progress() ||
> is_update_refs_in_progress();
>
> }
>
 OK

> - ShenandoahHeuristics::maybe_add_heap_region() ... should probably be a
> member of ShenandoahCollectionSet? And dunno if we can come up with a
> slightly more descriptive name? Can't quickly think of one though.
>
It requires information about the regions so I think it belongs in
shenandoah heuristics.

> - PartialHeuristics::from_idxs should be PartialHeuristics::_from_idxs
>
> OK

> 1376 void ShenandoahCollectorPolicy::choose_collection_set(ShenandoahCollectionSet* collection_set,1377                                                       bool minor) {1378   if (minor)1379     _minor_heuristics->choose_collection_set(collection_set, minor);1380   else1381     _heuristics->choose_collection_set(collection_set, minor);
> 1382 }
>
> There's no need to pass down 'minor', is there? It's not used downstream anyway.
>
> OK

> 59     } else if (heap->shenandoahPolicy()->should_start_partial_gc()) {60       if (! heap->need_update_refs())
> 61         service_partial_cycle();
>
> You added a check for need_update_refs() here. My idea is that heuristics that do partial cycles should never need update refs in between. Is this possible now?
>
> We are mixing partial (generational) collections with full (concurrent
marking and everything) cycles.  I moved the check into
should_start_partial_gc.

> There's a whitespace changes that's not for the better IMO: 49   void do_oop_work(T* p) {_partial_gc->process_oop<T, false>(p, _thread, _queue);}
>
> Fair enough

>
>
> That's all for now :-)
>
> http://cr.openjdk.java.net/~chf/GenerationalPartialGC/webrev.02/

Good to go?


Christine


More information about the shenandoah-dev mailing list