RFR (M): 8231579: G1's incremental calculation of region elapsed time always uses the same age group for prediction
Thomas Schatzl
thomas.schatzl at oracle.com
Wed Nov 20 12:49:49 UTC 2019
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)
Thanks,
Thomas
More information about the hotspot-gc-dev
mailing list