RFR: 8138975: G1CollectorPolicy::calculate_young_list_target_length should be const
Mikael Gerdin
mikael.gerdin at oracle.com
Wed Oct 7 12:20:40 UTC 2015
Hi Erik,
On 2015-10-07 14:16, Erik Helin wrote:
> On 2015-10-07, Mikael Gerdin wrote:
>> Hi Erik,
>>
>> On 2015-10-06 17:28, Erik Helin wrote:
>>> Hi all,
>>>
>>> this patch splits G1CollectorPolicy::update_young_list_target_length into
>>> two methods:
>>> - void G1CollectorPolicy::update_young_list_target_length()
>>> - size_t
>>> G1CollectorPolicy::bounded_young_list_target_length(bool is_young, size_t rs_lenghts) const
>>>
>>> This enables bounded_young_list_target_length to be const and then
>>> update_young_list_target_length can just set the field
>>> _young_list_target_length to the newly calculated value. Making
>>> bounded_young_list_target_length const revaled some strange
>>> side effects of update_young_list_target_length:
>>> - update_young_list_target_length also called
>>> update_max_gc_locker_expansion. I moved the call to
>>> update_max_gc_locker_expansion to all callsites of
>>> update_young_list_target_length.
>>
>> I'm not sure I like moving the call to update_max_gc_locker_expansions to
>> all callers of update_young_list_target_length.
>>
>> Would you mind adding a
>> void update_young_list_lengths() {
>> update_young_list_target_length();
>> update_max_gc_locker_expansion();
>> }
>> to encapsulate the code modifying the young list length a little?
>
> I added void G1CollectorPolicy::update_young_list_max_and_target_length
> that calls both update_young_list_target_length and
> update_max_gc_locker_expansion.
>
>>> - update_young_list_target_length sometimes updated the field
>>> _rs_lenghts_prediction. This is only needed when
>>> update_young_list_target_length is called from the
>>> ConcurrentG1RefinementThread that is scanning the rembered sets sizes
>>> of the YoungList, because _rs_lenghts_prediction is state that belongs
>>> to that thread but for some reason ended up in G1CollectorPolicy.
>>> Anyways, I moved the update of the field to only place where it is
>>> needed. This move will actually cause the "// Add 10% to avoid having to
>>> recalculate too often" comment to become correct since previously the
>>> field was only set via some code paths in
>>> update_young_list_target_length.
>>
>> Now that I've thought about this a bit I disagree. I think we need the code
>> in record*collection*end to update the _rs_lenghts_prediction.
>> Otherwise we could end up in a scenario where the condition in
>> revise_young_list_target_length_if_necessary is never true since the sampled
>> lengths is much smaller than the previous collection's prediction.
>>
>> Otherwise _rs_lenghts_prediction will degenerate to the maximum prediction
>> ever performed during the lifetime of a process.
>
> I agree, I added updates to _rs_lenghts_prediction at the end of the
> record*collection*end methods. I actually think that it would be better
> to reset it to zero, but lets be compatible with the old code for this
> patch.
>
>>>
>>> Enhancement:
>>> https://bugs.openjdk.java.net/browse/JDK-8138975
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~ehelin/8138975/webrev/
>>
>> I discussed the is_young bool parameter with Erik and we settled on removing
>> it at this point.
>> A lot of the underlying code still looks at the collector_state instead of
>> getting young/mixed via a parameter so we'll leave that as is for now.
>
> Yep, I've removed the is_young parameter to
> bounded_young_list_target_length. Please see new webrevs:
>
> Full:
> http://cr.openjdk.java.net/~ehelin/8138975/webrev.01/
>
> Incremental:
> http://cr.openjdk.java.net/~ehelin/8138975/webrev.00-01/
Looks good.
/Mikael
>
> Thanks,
> Erik
>
>> /Mikael
>>
>>>
>>> Testing:
>>> JPRT
>>>
>>> Thanks,
>>> Erik
>>>
>>
More information about the hotspot-gc-dev
mailing list