RFR(S): 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count

Tony Printezis tony.printezis at oracle.com
Mon Apr 9 21:12:25 UTC 2012


FWIW: John's analysis is quite spot on. One quick additional point 
though: when I simplified the marking code and adjusted the code that 
handles evacuation failure during initial-mark, I left 
_next_marked_bytes to be 0, even though I calculate the region's marked 
bytes anyway (in order to update _prev_marked_bytes). I instead set 
_top_at_conc_mark_count to bottom() and let the concurrent mark thread 
to do the calculation. See

HeapRegion::note_self_forwarding_removal_start()
HeapRegion::note_self_forwarding_removal_end()
and
RemoveSelfForwardPtrObjClosure::do_object()

(consider the case where during_initial_mark == true)

I just realized that there might be an additional issue with John's 
change. If we have an evac failure during initial-mark, the live bytes 
of the objects that are not evacuated out of a region (but are marked on 
the next bitmap during evac failure handling) will not be correctly 
accounted in _next_marked_bytes. (John, maybe you can  test this with 
your "evac failure a lot" patch - it'd only happen with an evac failure 
during initial mark?) I think the fix is straightforward. Add:

if (during_initial_mark) {
     _next_marked_bytes = marked_bytes;
}

in HeapRegion::note_self_forwarding_removal_end().

Apologies I missed this during my code review.

Tony


On 04/06/2012 05:19 PM, John Cuthbertson wrote:
> Hi Bengt,
>
> Thanks for looking over the changes. Your question is a good one. 
> Hopefully I can answer it to your satisfaction.
>
> The original liveness counting code walked marking bitmap (i.e. the 
> set bits) for the live objects between _top_at_conc_mark_count and 
> NTAMS. At the start of marking, _top_at_conc_mark_count was set to 
> start of the region.  In the event of an evacuation failure while 
> evacuating the objects in a region, R, not all the objects will have 
> been evacuated. So we would tell the counting code to revisit this 
> region bey setting _top_at_conc_mark_count to the region bottom. Any 
> non-evacuated explicitly marked objects would then be walked by the 
> counting code. Any explicitly marked objects that were successfully 
> evacuated would have had their marks propagated so that the new 
> location was marked, and the old marks would have been cleared.
>
> As a result of Tony's marking changes this whole mechanism changed. 
> Now if an evacuation failure occurs during an initial mark pause - any 
> non-evacuated objects in the region are explicitly marked and NTAMS is 
> set to top. Successfully evacuated objects will be copied above NTAMS 
> of the to-space region. When the non-evacuated objects are marked - 
> they will be included in the liveness counting. Objects that are 
> copied above NTAMS are included during the finalization of the 
> liveness counting during cleanup.
>
> The finalization of the liveness counting did include the range 
> [_top_at_conc_mark_count, NTAMS), but since the remark pause set 
> _top_at_conc_mark_count to NTAMS this interval was usually empty. If 
> we did get an evacuation failure during marking (and post remark) then 
> _top_at_conc_mark_count would have been reset. The only issue with 
> this is that we would include the objects in the region that got the 
> evacuation failure twice in the liveness counting data (once as a 
> result of an explicit mark (or successful copy) and the other from the 
> finalization code). This would look like we had more live data than we 
> actually did. When the original liveness counting changes were added 
> we knew that we would lose some accuracy. Removing the field will 
> reduce this inaccuracy.
>
> Does this answer your question?
>
> Thanks,
>
> JohnC
>
> On 04/03/12 06:04, Bengt Rutisson wrote:
>>
>> Hi John,
>>
>> I think your changes look good.
>>
>> Just a question for my understanding. You say "The value of 
>> _top_at_conc_mark_count is now the same as NTAMS". You are probably 
>> correct, but in HeapRegion::note_self_forwarding_removal_start() the 
>> old code was:
>>
>>  if (during_initial_mark) {
>>     ...
>>     _next_top_at_mark_start = top();
>>     set_top_at_conc_mark_count(bottom());
>>     ...
>>
>> Here we set NTAMS and _top_at_conc_mark_count() to different values. 
>> I assume that this did not have any effect, but can you explain why?
>>
>> Thanks,
>> Bengt
>>
>> On 2012-04-03 01:45, John Cuthbertson wrote:
>>> Hi Everyone,
>>>
>>> Here's my contribution to the cleanup week.
>>>
>>> Can I have a couple of volunteers review the changes for this CR? 
>>> The webrev can be found at: 
>>> http://cr.openjdk.java.net/~johnc/7143490/webrev.0/
>>>
>>> Summary:
>>> As a result of Tony's recent marking changes (associated with the 
>>> marking of survivors) the field HeapRegion::_top_at_conc_mark_count 
>>> is no longer required. The value of _top_at_conc_mark_count is now 
>>> the same as NTAMS. Additionally I simplified the verification code 
>>> that sets the bits in the live card bitmap and refactored the 
>>> closures that finalize and verify the liveness counting data to 
>>> avoid code duplication.
>>>
>>> Testing: I inserted a 500ms sleep in the marking cycle between the 
>>> remark and cleanup pauses to ensure that at least one evacuation 
>>> pause was seen during this phase, and ran the GC test suite with 
>>> several marking thresholds (2, 5, and 10%) and verification enabled.
>>>
>>> Thanks,
>>>
>>> JohnC
>>
>



More information about the hotspot-gc-dev mailing list