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
Fri Jun 10 18:27:31 UTC 2011


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