RFR (M): 8231579: G1's incremental calculation of region elapsed time always uses the same age group for prediction
Stefan Johansson
stefan.johansson at oracle.com
Wed Nov 20 13:43:17 UTC 2019
On 2019-11-20 13:49, Thomas Schatzl wrote:
> Hi Stefan,
>
> On 20.11.19 12:24, Stefan Johansson wrote:
>> Hi Thomas,
>>
>> On 2019-11-19 10:25, Thomas Schatzl wrote:
>>> Hi all,
>>>
>>> can I have reviews for this change that fixes use of the wrong
>>> predictors when adding a new mutator region to the collection set as
>>> it is retired?
>>>
>>> G1, through the young remset sampling thread, and the mutator threads
>>> when they retire, keep track of a prediction for the time it takes to
>>> evacuate the entire young gen.
>>>
>>> The mutator thread, when it retires a region, updates that value by
>>> the current prediction of that retired region: that is where the
>>> error occurs: currently, it only ever uses the prediction for the
>>> region that has been retired just before GC.
>>> Typically a lot of data in this region survives (e.g. 80%+), so the
>>> prediction for the overall young gen is heavily inflated.
>>> Which means that during mixed gc, a smaller than necessary amount of
>>> time is seen as left for evacuating old gen regions, which in turn
>>> means that G1 typically does more, shorter than expected mixed gcs.
>>>
>>> This wastes some throughput, as typically normal young collections
>>> can take a much larger eden.
>>>
>>> This change fixes that by the mutator and the young remset sampling
>>> thread not updating the time it takes to copy the contents of eden
>>> regions - the predictions for that are fixed anyway after a GC as the
>>> predictors for how many objects are expected to be live in a region
>>> are not updated while the mutator is running. Only other components
>>> of the prediction are.
>>>
>>> The time to copy the eden regions is later, when G1 finalizes the
>>> prediction for the time the young gen will take, added back.
>>>
>>> CR:
>>> https://bugs.openjdk.java.net/browse/JDK-8231579
>>> Webrev:
>>> http://cr.openjdk.java.net/~tschatzl/8231579/webrev/
>> Looks good, just some variable naming that I think should be updated:
>> src/hotspot/share/gc/g1/g1CollectionSet.cpp
>> ---
>> 248 double old_elapsed_time_ms = hr->predicted_non_copy_time_ms();
>> 249 double new_region_elapsed_time_ms =
>> predict_region_non_copy_time_ms(hr);
>> 250 double non_copy_time_ms_diff = new_region_elapsed_time_ms -
>> old_elapsed_time_ms;
>> 251 hr->set_predicted_non_copy_time_ms(new_region_elapsed_time_ms);
>> 252 _inc_predicted_non_copy_time_ms_diff += non_copy_time_ms_diff;
>>
>> I think the local variables should change to reflect the new naming,
>> something like "old_non_copy_time" and "new_non_copy_time".
>
> you are right. Fixed in
>
> http://cr.openjdk.java.net/~tschatzl/8231579/webrev.0_to_1/ (diff)
> http://cr.openjdk.java.net/~tschatzl/8231579/webrev.1/ (full)
Looks good.
Thanks,
Stefan
>
> Thanks,
> Thomas
More information about the hotspot-gc-dev
mailing list