RFR: 8275056: Virtualize G1CardSet containers over heap region [v2]

Stefan Johansson sjohanss at openjdk.java.net
Wed Oct 27 10:13:15 UTC 2021


On Thu, 21 Oct 2021 10:53:37 GMT, Thomas Schatzl <tschatzl at openjdk.org> wrote:

>> Hi all,
>> 
>> can I have reviews for this change that virtualizes `G1CardSet` "regions" over a heap region, allowing the use of multiple "`G1CardSet` card regions" across a single heap region?
>> 
>> I.e. `HeapRegionRemSet`, which is the interface to a region's card set, simply uses multiple indexes for the remembered set of a single source heap region if necessary. E.g. on a 128MB region, heap region 0's cards would be stored as (what I call) "card region" indexes 0..3 as appropriate in its `_card_set`.
>> 
>> When retrieving the values, the appropriate retransformation is done (during `HeapRegionRemSet::iterate_for_merge()`).
>> 
>> Assigning `HeapRegionRemSet` to handle all this multiplexing required some move of the `G1CardSet::iterate_for_merge` method to `HeapRegionRemSet`, which is why there are more changes than expected.
>> 
>> One change I would like to have opinions on is storing the amount of card regions per region into `G1CardSetConfiguration`, maybe it is better to put this into `HeapRegionRemSet` - but I did not want to start a `HeapRegionRemSetConfiguration` (maybe also put the cached values introduced in the `split_card` optimization there as well?).
>> 
>> This allows unlimited actual heap region size. Currently set to 512MB (what we would set ergonomically if on a 1 TB heap), but that's just a random number basically.
>> Feel free to suggest a different maximum heap region size if any. We could also keep the ergonomics use a smaller heap region size (e.g. 32M as before).
>> 
>> There is also a CSR to look at.
>> 
>> Testing: tier1-5, some perf testing on region sizes up to 512M with slight improvements in specjbb2015 with larger region sizes.
>> 
>> Thanks,
>> Thomas
>
> Thomas Schatzl has updated the pull request incrementally with one additional commit since the last revision:
> 
>   32 bit compatibility - limit region size to 32M there as before. Fix test.

Looks good, just a couple of small comments.

src/hotspot/share/gc/g1/g1CardSet.cpp line 68:

> 66:   _bitmap_hash_mask = ~(~(0) << _log2_num_cards_in_howl_bitmap);
> 67: 
> 68:   // Heap region virtualization.

Maybe some more descriptive comment, something like: 
Allow multiple card regions per heap region. This allows G1 to use larger heap regions without having to use a large integer type for the card index.

src/hotspot/share/gc/g1/g1CardSet.cpp line 71:

> 69:   _log2_card_region_per_heap_region = 0;
> 70: 
> 71:   uint bits_storable = G1CardSetContainer::LogCardsPerRegionLimit;

Any reason you really want this in a local variable instead of using `G1CardSetContainer::LogCardsPerRegionLimit` directly. If using a local I think the name should better match the constant.

-------------

Marked as reviewed by sjohanss (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/6059



More information about the hotspot-gc-dev mailing list