RFR: Coalesce and fill old, pinned regions after old gen final mark
William Kemper
wkemper at openjdk.org
Wed Jul 6 00:23:12 UTC 2022
On Wed, 6 Jul 2022 00:18:02 GMT, William Kemper <wkemper at openjdk.org> wrote:
>> src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp line 217:
>>
>>> 215: candidates[cand_idx]._garbage = 0;
>>> 216: cand_idx++;
>>> 217: }
>>
>> Even when sorted to the end of the candidate list, it is still possible that the region might be selected as part of a mixed evacuation. What's to prevent that from happening? Also, as I contemplate this scenario, what will happen if an old-gen region is not pinned "now", but becomes pinned before it is included into the mixed-evacuation collection set? Do we handle that case properly?
>
> If it is selected as a candidate for an old evacuation, access to it will be protected by the mark bitmap (`heap->doing_mixed_evacuations()` will be true).
>
> Hmm, we might not handle that case properly. Independent of the filling dead objects issue, I can see nothing to prevent old regions with a `pin_count() > 0` from being added to a mixed collection (which would be bad for other reasons). I shall convert this PR to draft until we have a solution that handles that scenario. Perhaps we can also address Ramki's concern that regions that become 'unpinned' before the mixed collection _should_ be included.
The root of the issue is that mutator threads change `pin_count`, but only the gc threads transition (or synchronize) the pin count with `pinned` or `unpinned` states.
-------------
PR: https://git.openjdk.org/shenandoah/pull/149
More information about the shenandoah-dev
mailing list