Collection set is empty -> conc mark cancelled

Aleksey Shipilev shade at redhat.com
Thu Nov 24 13:31:40 UTC 2016


Hi,

On 11/24/2016 02:17 PM, Roman Kennke wrote:
> Interestingly, I ran into this myself when I played with heuristics
> yesterday :-)
> 
>> My question is: what's the purpose for that _collection_set->count()
>> ==
>> 0 check?
> 
> dunno. The idea might have been that if the cset ends up empty,
> something is wrong. But as you say, it seems superfluous.
> 
>>  Seems superfluous to me, because we had already had our mark,
>> and heading to conc evac. What are we canceling? Seems incorrect to
>> assume that empty collection set is somehow the detractor from
>> the  conc
>> mark -- like in the benchmark above, where rootset mutates, but no
>> garbage is effectively produced.
>>
>> Or, at very least, should we reset the concgc flag somewhere else?

It is being reset after full GC. All other uses of cancel_concgc()
trigger the full GC, except this one. So, there are two options:

 a) Drop the cset-is-empty check, and probably spin back to concurrent
mark again on the next cycle;

-    if (_collection_set->count() == 0)
-      cancel_concgc();
-


 b) Cancel the mark, but also schedule the full GC:

-    if (_collection_set->count() == 0)
+    if (_collection_set->count() == 0) {
+      concurrent_thread()->schedule_full_gc();
       cancel_concgc();
+    }


Both options resolve the hiccup. The question is, do we need to treat
empty cset specially or not? Since this is a corner case, we may want to
play it safe with option (b). Thoughts?

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list