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

John Cuthbertson john.cuthbertson at oracle.com
Mon Sep 24 17:00:55 UTC 2012

Hi Jesper,

Thanks for review. That is a good idea (and we have entertained doing it 
in the past) but is does have a slight downside.

We need to set bits for all the cards spanned by a live object - 
including the last card if the object doesn't end at a card boundary. If 
we made set_card_bitmap_range() exclusive we end up moving the logic to 
determine which card index would be the second parameter into the 
callers (or a utility routine). The logic in the caller becomes 
something like:

HeapWord* end = obj + obj->size();
idx_t end_idx = card_bitmap_index_for(end);
if (!card_aligned(end)) {
// Next object doesn't start on a card boundary.We need to also include 
the card in which the current object ends.
end_idx += 1;
set_card_bitmap_range(start_idx, end_idx);


HeapWord* last = obj + obj->size() - 1;
idx_t last_idx = card_bitmap_index_for(last)
set_card_bitmap_range(start_idx, last_idx)

The mapping from the inclusive range to cards to the exclusive range 
expected by the bitmap routines is localized in set_card_bitmap_range().

I don't think either is really better than the other.


On 09/21/12 21:16, 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