7118202: G1: eden size unnecessarily drops to a minimum

An integer underflow can cause the RSet lengths to be massively overpredicted which forces the eden size to the minimum.

Reviewed-by: brutisso, johnc
This commit is contained in:
Antonios Printezis 2011-12-07 12:54:51 -05:00
parent 78d7be03bf
commit 4799ed65a4

View File

@ -1549,9 +1549,15 @@ void G1CollectorPolicy::record_collection_pause_end(int no_of_gc_threads) {
_partially_young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
}
size_t rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
if (rs_length_diff >= 0)
_rs_length_diff_seq->add((double) rs_length_diff);
// It turns out that, sometimes, _max_rs_lengths can get smaller
// than _recorded_rs_lengths which causes rs_length_diff to get
// very large and mess up the RSet length predictions. We'll be
// defensive until we work out why this happens.
size_t rs_length_diff = 0;
if (_max_rs_lengths > _recorded_rs_lengths) {
rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
}
_rs_length_diff_seq->add((double) rs_length_diff);
size_t copied_bytes = surviving_bytes;
double cost_per_byte_ms = 0.0;