survRateGroup.hpp revision 8413:92457dfb91bd
1/*
2 * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_GC_G1_SURVRATEGROUP_HPP
26#define SHARE_VM_GC_G1_SURVRATEGROUP_HPP
27
28#include "utilities/numberSeq.hpp"
29
30class G1CollectorPolicy;
31
32class SurvRateGroup : public CHeapObj<mtGC> {
33private:
34  G1CollectorPolicy* _g1p;
35  const char* _name;
36
37  size_t  _stats_arrays_length;
38  double* _surv_rate;
39  double* _accum_surv_rate_pred;
40  double  _last_pred;
41  double  _accum_surv_rate;
42  TruncatedSeq** _surv_rate_pred;
43  NumberSeq**    _summary_surv_rates;
44  size_t         _summary_surv_rates_len;
45  size_t         _summary_surv_rates_max_len;
46
47  int _all_regions_allocated;
48  size_t _region_num;
49  size_t _setup_seq_num;
50
51public:
52  SurvRateGroup(G1CollectorPolicy* g1p,
53                const char* name,
54                size_t summary_surv_rates_len);
55  void reset();
56  void start_adding_regions();
57  void stop_adding_regions();
58  void record_surviving_words(int age_in_group, size_t surv_words);
59  void all_surviving_words_recorded(bool propagate);
60  const char* name() { return _name; }
61
62  size_t region_num() { return _region_num; }
63  double accum_surv_rate_pred(int age) {
64    assert(age >= 0, "must be");
65    if ((size_t)age < _stats_arrays_length)
66      return _accum_surv_rate_pred[age];
67    else {
68      double diff = (double) (age - _stats_arrays_length + 1);
69      return _accum_surv_rate_pred[_stats_arrays_length-1] + diff * _last_pred;
70    }
71  }
72
73  double accum_surv_rate(size_t adjustment);
74
75  TruncatedSeq* get_seq(size_t age) {
76    if (age >= _setup_seq_num) {
77      guarantee( _setup_seq_num > 0, "invariant" );
78      age = _setup_seq_num-1;
79    }
80    TruncatedSeq* seq = _surv_rate_pred[age];
81    guarantee( seq != NULL, "invariant" );
82    return seq;
83  }
84
85  int next_age_index();
86  int age_in_group(int age_index) {
87    int ret = (int) (_all_regions_allocated - age_index);
88    assert( ret >= 0, "invariant" );
89    return ret;
90  }
91  void finished_recalculating_age_indexes() {
92    _all_regions_allocated = 0;
93  }
94
95#ifndef PRODUCT
96  void print();
97  void print_surv_rate_summary();
98#endif // PRODUCT
99};
100
101#endif // SHARE_VM_GC_G1_SURVRATEGROUP_HPP
102