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:44:26 UTC 2013
Hi John,
On 2/11/13 9:33 PM, John Cuthbertson wrote:
> Hi Bengt,
>
> Jesper's code does that by the having the "start_of_humongous" clause
> before the iterate call in the condition. The compiler should
> short-circuit that and skip the iterate call for an h-obj.
Yes, you and Jesper are right. My bad.
> My concern/objection is that is not explicitly clear from the code and
> you're comment sort of confirms that. :)
:) Now I can't really argue with that ;)
Bengt
>
> You have to really study the code to satisfy yourself that it's correct.
>
> Thanks,
>
> JohnC
>
> On 2/11/2013 12:17 PM, Bengt Rutisson wrote:
>>
>> 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