Request for review: 6976350 G1: deal with fragmentation while copying objects during GC

Bengt Rutisson bengt.rutisson at
Thu May 30 12:53:16 UTC 2013

Hi Tao,

I think the code is a little bit confused about whether 
G1MultiParGCAllocBuffer can handle an arbitary number of AllocPriorites 
or just 2. All the for loops indicate that we think we might want to 
change from 2 to a larger number in the future. But the naming of a 
method like words_remaining_in_retired() indicate that there can only be 
one retired region. With the current implementation I think 
words_remaining_in_retired() should be called something like 

I think it would be good to make this code truly general with respect to 
the number of priorities. We can then use 2 as default, but make sure 
that the code works with more priorities. To do that I think we should 
remove the enum GCAllocPriority and instead have a field in 
G1MultiParGCAllocBuffer that contains the maximum number of priorities. 
I think that will make the code more general and easier to read. The for 
loops would look like:

     for (int pr = 0; pr < _max_priorities; ++pr) {
       // do stuff

I find the name G1MultiParGCAllocBuffer confusing since it is not 
inheriting G1ParGCAllocBuffer. Maybe G1AllocBufferContainer or something 
like that would make more sense?

I don't understand why you added initialization values to 
GCAllocPurpose. You are only using the values that are default in C++ 
anyway: 0, 1, 2. At least if you avoid adding the GCAllocPurposeStart 
value. I think it was more readable before your change. (The same 
argument holds for GCAllocPriority, but I prefer to remove that enum all 
together as I described above.)

Have you considered moving the _retired field from G1ParGCAllocBuffer to 
ParGCAllocBuffer instead of making the retire() method virtual? (I do 
think your change to virtual is needed in the current code, so good 
catch! But I think it might make sense to have the logic of 
G1ParGCAllocBuffer::retire() in ParGCAllocBuffer::retire() instead.)

A couple of minor things:

1800     if (finish_undo != true) ShouldNotReachHere();

should be:

1800     if (!finish_undo) ShouldNotReachHere();

  Please add spaces before and after "=" here:
1804     size_t result=0;

There are two spaces after "=" here:
1812     G1ParGCAllocBuffer* retired = _priority_buffer[GCAllocPriority1];

Also, in g1CollectedHeap.hpp you have updated the copyright year but not 
in parGCAllocBuffer.hpp. As you know we in the GC team have agreed not 
to update the copyright year. If you absolutely want to do it I think 
you should do it the same way in all files.


On 5/24/13 1:31 AM, Tao Mao wrote:
> Can I have a couple of reviewers please?
> Thank you.
> Tao
> On 5/20/13 5:11 PM, Tao Mao wrote:
>> Hi all,
>> a new webrev
>> diff:
>> (1) John Cuthbertson and I figured out the way to handle "retire an 
>> old buffer, allocate and set a new one" and it can possibly make the 
>> usage of allocation buffer a little more efficient.
>> (2) Make the assertion as John suggested and provide some harness 
>> (i.e. making retire() a virtual function) to cope with it.
>> Thanks.
>> Tao
>> On 5/15/13 10:58 PM, John Cuthbertson wrote:
>>> Hi Tao,
>>> This looks excellent. One minor question: does it make sense to 
>>> assert that each buffer has been retired? It might save a missed 
>>> call to PSS::retire_alloc_buffers. I'll leave the decision to you. 
>>> Ship it.
>>> JohnC
>>> On 5/14/2013 3:06 PM, Tao Mao wrote:
>>>> To the open list:
>>>> new webrev:
>>>> I took suggestion from many reviewers into consideration and came 
>>>> up with the current cleaner solution.
>>>> Thank you.
>>>> Tao
>>>> On 5/14/13 2:26 PM, Jon Masamitsu wrote:
>>>>> What's the status of this review?
>>>>> The last mail I  could find in my mail boxes was a comment
>>>>> from Thomas.
>>>>> Jon
>>>>> On 1/28/13 12:21 PM, Tao Mao wrote:
>>>>>> 6976350 G1: deal with fragmentation while copying objects during GC
>>>>>> webrev:
>>>>>> changeset:
>>>>>> Basically, we want to reuse more of par-allocation buffers 
>>>>>> instead of retiring it immediately when it encounters an object 
>>>>>> larger than its remaining part.
>>>>>> (1) instead of previously using one allocation buffer per GC 
>>>>>> purpose, we use N(=2) buffers per GC purpose and modify the 
>>>>>> corresponding code. The changeset would easily scale up to 
>>>>>> whatever N (though Tony Printezis suggests 2, or 3 may be good 
>>>>>> enough)
>>>>>> *(2) Two places of cleanup: allocate_during_gc_slow() is removed 
>>>>>> due to its never being called.
>>>>>>                                               access modifier 
>>>>>> (public) before trim_queue() is redundant.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the hotspot-gc-dev mailing list