RFR(S): 7200261: G1: Liveness counting inconsistencies during marking verification

John Cuthbertson john.cuthbertson at oracle.com
Tue Sep 25 17:54:29 UTC 2012

Hi Jon,

AFAIK this was the only place.

I don't recall any comment from Dave Detlefs in the original code 
explaining why. Most of the ranges (address ranges in regions etc) are 
exclusive. But this is the only place in G1 where we need the range of 
cards spanned by an object. In the original code - Dave was just using 
an inclusive loop - which set each bit in the inclusive range of cards 
individually. We changed the code to use the BitMap routines because 
they can work at the word level for large ranges, which should be more 
efficient. Hence this inclusive range was mapped to the exclusive range 
needed by the range utility routines in the BitMap class.

Do you know, offhand, how the other collectors find all of the cards 
spanned by a single object? Do they calculate an inclusive or exclusive 
range of cards? Do they use the last address word in the current object, 
or the start of the next object? In an earlier life, I can remember 
fixing a few OOB assertions (in the DirtyCardToOopClosures I believe) 
caused by attempting to get the card for the address returned by 
MemRegion::end() instead of MemRegion::last().

Having made the routine and call sites exclusive we could end up with a 
pointer that is actually outside the heap (if we're examining the last 
object in the heap) which will cause an assertion in 
CardTableModRefBS::is_card_aligned() to fire unless 
CardTableModRefBS::is_card_aligned() is guarded with a heap range check. 
With an inclusive range routine you can assume that the last address 
word of any object in the heap is also in the heap and so don't need to 
check if it's card aligned (no need to increment) and hence no need to 
check if it's in the heap.

Anyway the routine now takes an exclusive range - which, IMO, doesn't 
look any cleaner than the previous code. Expect a new webrev after some 
more testing.


On 09/25/12 06:41, Jon Masamitsu wrote:
> John,
> Is it common practice in G1 code to have the ranges
> be inclusive?
> Jon
> PS.  Sorry for being tardy on my reply - so much mail,
> so little time :-)
> On 09/24/12 10:03, John Cuthbertson wrote:
>> Hi Jon,
>> Thanks for the comments. I'm going to refer you to my reply to 
>> Jesper. If people feel strongly about making the routine exclusive - 
>> I'll make it so.
>> JohnC
>> On 09/21/12 22:48, Jon Masamitsu wrote:
>>> I'm used to seeing a range like [start, end).  That the second index 
>>> is named
>>> last_idx helps but if I were just looking at the call site, I would 
>>> have guessed
>>> wrongly - i.e., thinking it was [start, end).
>>> Jon
>>> On 9/21/2012 9:16 PM, Jesper Wilhelmsson wrote:
>>>> John,
>>>> Looks good!
>>>> Would it make sense to change set_card_bitmap_range to be 
>>>> exclusive, or even to take a start and a size of the area? I think 
>>>> inclusive functions like this one are unintuitive, especially when 
>>>> the only use of last_idx is used with a +1. Maybe that's a 
>>>> different change?
>>>> /Jesper
>>>> 22 sep 2012 kl. 01:37 skrev John 
>>>> Cuthbertson<john.cuthbertson at oracle.com>:
>>>>> Hi Everyone,
>>>>> Can I have a couple of volunteers look over the fix for this CR? 
>>>>> The webrev can be found at: 
>>>>> http://cr.openjdk.java.net/~johnc/7200261/webrev.0/
>>>>> Summary:
>>>>> The clipping in the code that sets the bits for a range of cards 
>>>>> in the "expected" card bitmap that we check the liveness 
>>>>> accounting data against was incorrect. This could lead to spurious 
>>>>> verification failures. In addition to fixing the clipping, I've 
>>>>> upleveled this routine and moved it into ConcurrentMark and now 
>>>>> use it to generate the real liveness data.
>>>>> Testing:
>>>>> The failing test cases with marking verification; jprt.
>>>>> Thanks,
>>>>> JohnC

More information about the hotspot-gc-dev mailing list