RFR (S): 8131734: Add free_archive_regions support to G1 for -Xshared:auto

Thomas Schatzl thomas.schatzl at oracle.com
Wed Aug 12 10:37:43 UTC 2015


Hi,

On Tue, 2015-08-11 at 20:02 -0400, Kim Barrett wrote:
> On Aug 11, 2015, at 5:40 PM, Tom Benson <tom.benson at oracle.com> wrote:
> > 
> > On 8/11/2015 5:24 PM, Kim Barrett wrote:
> >> On Aug 11, 2015, at 1:43 PM, Tom Benson <tom.benson at oracle.com> wrote:
> >>> Updated full and incremental webrevs of the GC code are at:
> >>> http://cr.openjdk.java.net/~tbenson/8131734/webrev.02/
> >>> http://cr.openjdk.java.net/~tbenson/8131734/webrev.02.vs.01/
> >> Can this introduce uncommitted "holes" in committed space?  It seems
> >> like it might.  Otherwise, why introduce shrink_at, rather than just
> >> using shrink_by.  I'm not sure such holes are presently possible, and
> >> I'm not sure they are handled properly everywhere.
> > shrink_by looks for free ranges it can uncommit.  Here, we want to
> > uncommit the specific region(s) allocated with alloc_archive_regions.
> > There is an expand_at that takes a specific index, which shrink_at is
> > intended to be analogous to.
> 
> I seem to have earlier convinced myself that shrink_by would be
> confused by a hole; after staring at it some more, I now think it's
> ok.  Sorry for the noise.
> 
> But I think there might be an unrelated pre-existing performance bug
> in shrink_by.  Line 431 is "cur -= num_last_found;".  If the recent
> scan had to skip over a block of !available || !empty regions to find
> the regions that were just removed, that skipped block isn't accounted
> for by that decrement.  I think a better iteration step would be "cur
> = idx_last_found;".  [This is part of what confused me about holes.]

That's true. I filed https://bugs.openjdk.java.net/browse/JDK-8133456.

> > G1 is designed to allow uncommitted holes.   Even without this
> >change, there is a big 'hole' in committed space:    All the regions
> >between the low end of the heap where mutator allocation is occurring
> >(initially sized by Xms)  and these archive regions which are at the
>>highest end of the (Xmx-sized) heap.
> > 
> > In a way,  as used by CDS, calling dealloc_archive_regions is
>>*removing* that hole. 8^)     The entire upper portion of the heap
>>(above Xms) will again be uncommitted, as if alloc_archive_regions had
>>never been called.
> 
> I do see code that seems to be intended to cope with such holes.
> 
> I wonder though, were there ever uncommitted holes in practice before
> the introduction of this new archive region feature?  Previously, the
> only time a region gets uncommitted is after a full gc.  I've not
> studied G1's full gc enough to even guess whether it could leave such
> holes. 

Yes, when there are humongous objects in the heap.

> If the answer is no, there could be lurking bugs waiting to be
> uncovered.  I guess we'll deal with those if/when we find them.

There are explicit tests in the jtreg tests (gc/g1/TestShrink*) that
test shrinking, and TestShrinkDefragmentedHeap in particular tests this.

Also there are a few stress tests (ArrayJuggle*) that repeatedly create
holes using large objects and do full collections that cause heap
shrinking.

Thanks,
  Thomas




More information about the hotspot-gc-dev mailing list