CRR (M/L - re-opened): 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
Tony Printezis
tony.printezis at oracle.com
Tue Jun 14 22:35:43 UTC 2011
Hi,
Latest workspace after merging with the last few changesets that we've
pushed recently:
http://cr.openjdk.java.net/~tonyp/7039627/webrev.1/
(if you started looking at the first version you don't need to switch to
this one, the contents should be mostly the same)
Tony
Tony Printezis wrote:
> Hi,
>
> I'd like to re-open this for code review. I brought the workspace
> up-to-date. Here's the webrev:
>
> http://cr.openjdk.java.net/~tonyp/7039627/webrev.0/
>
> Still need a couple of code review pretty please. :-)
>
> Tony
>
> Tony Printezis wrote:
>> Hi,
>>
>> This is the long-awaited :-) GC alloc region refactoring for G1 that
>> I've been working on for a while now (in the background).
>>
>> A lot of that allocation code during GC is very similar to the code
>> that manages the mutator allocation regions so we might as well share
>> it. We recently introduced the G1AllocRegion abstraction for mutator
>> alloc regions. Now we're going to re-use it for GC alloc regions too
>> (and remove a lot of replicated code in the process).
>>
>> The webrev is here:
>>
>> http://cr.openjdk.java.net/~tonyp/7039627/webrev.0/
>>
>> (don't let the number of lines changed intimidate you; over 60% of
>> them correspond to code that was removed)
>>
>> Quick summary of the improvements:
>>
>> - Removed most of the code that manages the GC alloc regions and
>> replaced it with subclasses of G1AllocRegion (one for survivor
>> regions, the other for old regions). We now keep the two GC alloc
>> regions separate (before they could point to the same physical
>> region) as we have to handle them differently (do/don't do BOT
>> updates, retire them differently, etc.) and we don't want to have to
>> add checks everywhere.
>> - No BOT updates for survivor regions (the same way we do not need
>> them for mutator allocation regions).
>> - The cards of survivor regions are now dirtied incrementally (the
>> same way it's done for mutator allocation regions).
>> - We do not link the GC alloc regions into a list any more in order
>> to do any post-GC cleanup on them at the end of the GC. Instead, any
>> cleanup that needs to be done it's done as each region is retired. So
>> we save the extra post-GC step.
>> - Apart from not linking the GC alloc regions, I also removed the
>> "is_gc_alloc" flag as we do not need to check it any more (and this
>> saves us having to reset the flag at the end of the GC, which helped
>> in eliminating the post-GC cleanup step).
>> - The new code also fixes a subtle bug. In the old code, when a GC
>> thread allocated a new region is allowed other threads to allocate
>> out of it before attempting its allocation (the allocation that
>> essentially caused the new region to be allocated). But, that
>> allocation is not guaranteed to succeeded (given that other threads
>> might have meanwhile filled up the region) and this was not handled
>> correctly in the code. This would cause an unnecessary evacuation
>> failure. The new code fixes this bug as this case is handled
>> correctly in the G1AllocRegion class (the thread that allocates the
>> region will first satisfy its own allocation request before allowing
>> anybody else to allocate out of the new region).
>>
>> I'd like a couple of reviews please. :-)
>>
>> Tony
>>
>>
>
More information about the hotspot-gc-dev
mailing list