RFR(S): 7185699: G1: Prediction model discrepancies

John Cuthbertson john.cuthbertson at oracle.com
Thu Jul 26 21:26:13 UTC 2012


Hi Thomas,

I like your suggested changes. I'll be sending out a new webrev shortly.

Thanks,

JohnC


On 07/26/12 01:04, Thomas Schatzl wrote:
> Hi,
>
> On Wed, 2012-07-25 at 11:39 -0700, John Cuthbertson wrote:
>   
>> Hi Thomas,
>>
>> On 7/25/2012 2:14 AM, Thomas Schatzl wrote:
>>     
>>> Looking at the code (copied below for convenience), during that time the
>>> number of cards prediction for young gen regions is based on the
>>> prediction of mixed collection card lengths (as expected), but at the
>>> same time, the "other" time prediction is based on the time prediction
>>> for the young collections.
>>>
>>> This seems odd, because I'd expect both prediction components to be
>>> based on the same prior decision at all times.
>>>       
>> [...]
>>
>> It looks like we're keeping track of how long it takes to add a region 
>> to the collection set and how long it takes to free a region in the 
>> collection set (based upon the region type). Haven't you shown that 
>> freeing old regions during mixed GCs takes a lot longer than freeing 
>> young regions? So choosing the other time for a region (vs. the base 
>> other time for the pause) is a function of the region's type and not the 
>> GC type. Though I'm not sure why we pass it as a parameter. I'll play 
>>     
>
> My issue was more about that the current code predicts the number of
> cards for young gen regions as a function of the gc type, and not as a
> function of its type.
>
> I believe a similar argument than for the "other" time applies to the
> number of cards for young gen regions during mixed collections.
> However, the difference between the two is that G1 only has a per-gc
> type prediction for card numbers. This is unlike the "other" time where
> it is calculated per region type, although the naming is very similar.
>
> That's probably what was confusing me.
>
>   
>> around with refactoring the code to eliminate inlining the code into 
>> calc_gc_efficiency().
>>     
>
>
> Okay, then maybe something like this:
>
> double
> // the bool parameter selects the gc type we want the prediction for
> G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr, bool
> estimate_for_during_young_gc) {
>   size_t rs_length = hr->rem_set()->occupied();
>   size_t card_num;
>
>   if (estimate_for_during_young_gc) {
>     card_num = predict_young_card_num(rs_length);
>   } else {
>     card_num = predict_non_young_card_num(rs_length);
>   }
>   size_t bytes_to_copy = predict_bytes_to_copy(hr);
>
>   double region_elapsed_time_ms =
>     predict_rs_scan_time_ms(card_num) +
>     predict_object_copy_time_ms(bytes_to_copy);
>
>   // we use the region type here to discriminate between the predictors
>   // for the other time because they are by region type.
>   if (hr->is_young())
>     region_elapsed_time_ms += predict_young_other_time_ms(1);
>   else
>     region_elapsed_time_ms += predict_non_young_other_time_ms(1);
>
>   return region_elapsed_time_ms;
> }
>
> and replace the actual parameters in calls to
> predict_region_elapsed_time_ms() to gcs_are_young(), but keep the
> "false" value in HeapRegion::calc_gc_efficiency().
>
> I attached a patch to demonstrate the change.
>
> Thomas
>
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20120726/394d992e/attachment.htm>


More information about the hotspot-gc-dev mailing list