RFR(S): 8007772: G1: assert(!hr->isHumongous() || mr.start() == hr->bottom()) failed: the start of HeapRegion and MemRegion should be consistent for humongous regions

Bengt Rutisson bengt.rutisson at oracle.com
Mon Feb 11 20:17:00 UTC 2013


Jesper,

I'll let John correct me if I'm wrong here, but I think the idea behind 
the original patch was to avoid the call to _nextMarkBitMap->iterate(), 
so I think we miss that enhancement if we include it in the first 
if-statement.

I agree that it would be nice to get rid of the code duplication, but I 
am not quite sure how.

Bengt


On 2/11/13 7:48 PM, Jesper Wilhelmsson wrote:
> John,
>
> Would it make sense to replace this code
>
> if (mr.is_empty()) {
>   giveup_current_region();
>   regular_clock_call();
> } else if (_curr_region->isHumongous() && mr.start() == 
> _curr_region->bottom()) {
>   if (_nextMarkBitMap->isMarked(mr.start())) {
>     // The object is marked - apply the closure
>     BitMap::idx_t offset = _nextMarkBitMap->heapWordToOffset(mr.start());
>     bitmap_closure.do_bit(offset);
>   }
>   // Even if this task aborted while scanning the humongous object
>   // we can (and should) give up the current region.
>   giveup_current_region();
>   regular_clock_call();
> } else if (_nextMarkBitMap->iterate(&bitmap_closure, mr)) {
>   giveup_current_region();
>   regular_clock_call();
> } else {
>
>
> with this code
>
>
> bool start_of_humongous = _curr_region->isHumongous() &&
>                           mr.start() == _curr_region->bottom();
>
> if (mr.is_empty() || start_of_humongous ||
>     _nextMarkBitMap->iterate(&bitmap_closure, mr)) {
>
>   if (start_of_humongous && _nextMarkBitMap->isMarked(mr.start())) {
>     // The object is marked - apply the closure
>     BitMap::idx_t offset = _nextMarkBitMap->heapWordToOffset(mr.start());
>     bitmap_closure.do_bit(offset);
>   }
>   // Even if this task aborted while scanning the humongous object
>   // we can (and should) give up the current region.
>   giveup_current_region();
>   regular_clock_call();
> } else {
>
>
> to avoid some code duplication?
> /Jesper
>
>
> On 11/2/13 7:01 PM, John Cuthbertson wrote:
>> Hi Everyone,
>>
>> Can I get a couple of reviews of this fix - the webrev can be found at:
>> http://cr.openjdk.java.net/~johnc/8007772/webrev.0/
>>
>> Summary:
>> An assert I asked Tao to add during his recent scanning optimization for
>> Humongous regions was failing. The reason was because the local 
>> marking task
>> could have been signaled to abort (because it exceeded it's time 
>> interval) while
>> scanning the humongous object. In this case we would restart the 
>> marking step
>> with a memory region with a slightly different starting address 
>> causing the
>> assert to trip. Without the assert this would nullify Tao change and 
>> cause
>> further unnecessary scanning of (a subset of) the humongous object. 
>> We should be
>> giving up the current humongous region even if the task is asked to 
>> abort.
>>
>> Testing:
>> The failing tests from nsk.stress and vm.gc nightly tests.
>>
>> Without fix:
>> TOTAL TESTS IN RUN: 154
>> TEST PASS: 102; 66% rate
>> TEST FAIL: 52; 33% rate
>> TEST UNDEFINED: 0; 0% rate
>> TEST INCOMPLETE: 0; 0% rate
>> TESTS NOT RUN: 0
>>
>> With fix:
>> TOTAL TESTS IN RUN: 154
>> TEST PASS: 153; 99% rate
>> TEST FAIL: 1; 0% rate
>> TEST UNDEFINED: 0; 0% rate
>> TEST INCOMPLETE: 0; 0% rate
>> TESTS NOT RUN: 0
>>
>> The remaining failure is FinalizerTest03 - a known failure.
>>
>> Thanks,
>>
>> JohnC
>>




More information about the hotspot-gc-dev mailing list