comparison src/share/vm/gc_implementation/g1/survRateGroup.cpp @ 545:58054a18d735

6484959: G1: introduce survivor spaces 6797754: G1: combined bugfix Summary: Implemented a policy to control G1 survivor space parameters. Reviewed-by: tonyp, iveresov
author apetrusenko
date Fri, 06 Feb 2009 01:38:50 +0300
parents 37f87013dfd8
children 0fbdb4381b99
comparison
equal deleted inserted replaced
544:82a980778b92 545:58054a18d735
27 27
28 SurvRateGroup::SurvRateGroup(G1CollectorPolicy* g1p, 28 SurvRateGroup::SurvRateGroup(G1CollectorPolicy* g1p,
29 const char* name, 29 const char* name,
30 size_t summary_surv_rates_len) : 30 size_t summary_surv_rates_len) :
31 _g1p(g1p), _name(name), 31 _g1p(g1p), _name(name),
32 _all_regions_allocated(0),
33 _curr_length(0), _scan_only_prefix(0), _setup_seq_num(0),
34 _array_length(0), _surv_rate(NULL), _accum_surv_rate_pred(NULL),
35 _accum_surv_rate(0.0), _surv_rate_pred(NULL), _last_pred(0.0),
36 _summary_surv_rates_len(summary_surv_rates_len), 32 _summary_surv_rates_len(summary_surv_rates_len),
37 _summary_surv_rates_max_len(0), 33 _summary_surv_rates_max_len(0),
38 _summary_surv_rates(NULL) { 34 _summary_surv_rates(NULL),
39 35 _surv_rate(NULL),
40 // the following will set up the arrays with length 1 36 _accum_surv_rate_pred(NULL),
41 _curr_length = 1; 37 _surv_rate_pred(NULL)
42 stop_adding_regions(); 38 {
43 guarantee( _array_length == 1, "invariant" ); 39 reset();
44 guarantee( _surv_rate_pred[0] != NULL, "invariant" );
45 _surv_rate_pred[0]->add(0.4);
46 all_surviving_words_recorded(false);
47 _curr_length = 0;
48
49 if (summary_surv_rates_len > 0) { 40 if (summary_surv_rates_len > 0) {
50 size_t length = summary_surv_rates_len; 41 size_t length = summary_surv_rates_len;
51 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length); 42 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length);
52 if (_summary_surv_rates == NULL) { 43 if (_summary_surv_rates == NULL) {
53 vm_exit_out_of_memory(sizeof(NumberSeq*) * length, 44 vm_exit_out_of_memory(sizeof(NumberSeq*) * length,
58 } 49 }
59 50
60 start_adding_regions(); 51 start_adding_regions();
61 } 52 }
62 53
54
55 void SurvRateGroup::reset()
56 {
57 _all_regions_allocated = 0;
58 _scan_only_prefix = 0;
59 _setup_seq_num = 0;
60 _stats_arrays_length = 0;
61 _accum_surv_rate = 0.0;
62 _last_pred = 0.0;
63 // the following will set up the arrays with length 1
64 _region_num = 1;
65 stop_adding_regions();
66 guarantee( _stats_arrays_length == 1, "invariant" );
67 guarantee( _surv_rate_pred[0] != NULL, "invariant" );
68 _surv_rate_pred[0]->add(0.4);
69 all_surviving_words_recorded(false);
70 _region_num = 0;
71 }
72
73
63 void 74 void
64 SurvRateGroup::start_adding_regions() { 75 SurvRateGroup::start_adding_regions() {
65 _setup_seq_num = _array_length; 76 _setup_seq_num = _stats_arrays_length;
66 _curr_length = _scan_only_prefix; 77 _region_num = _scan_only_prefix;
67 _accum_surv_rate = 0.0; 78 _accum_surv_rate = 0.0;
68 79
69 #if 0 80 #if 0
70 gclog_or_tty->print_cr("start adding regions, seq num %d, length %d", 81 gclog_or_tty->print_cr("[%s] start adding regions, seq num %d, length %d",
71 _setup_seq_num, _curr_length); 82 _name, _setup_seq_num, _region_num);
72 #endif // 0 83 #endif // 0
73 } 84 }
74 85
75 void 86 void
76 SurvRateGroup::stop_adding_regions() { 87 SurvRateGroup::stop_adding_regions() {
77 size_t length = _curr_length; 88
78 89 #if 0
79 #if 0 90 gclog_or_tty->print_cr("[%s] stop adding regions, length %d", _name, _region_num);
80 gclog_or_tty->print_cr("stop adding regions, length %d", length); 91 #endif // 0
81 #endif // 0 92
82 93 if (_region_num > _stats_arrays_length) {
83 if (length > _array_length) {
84 double* old_surv_rate = _surv_rate; 94 double* old_surv_rate = _surv_rate;
85 double* old_accum_surv_rate_pred = _accum_surv_rate_pred; 95 double* old_accum_surv_rate_pred = _accum_surv_rate_pred;
86 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred; 96 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred;
87 97
88 _surv_rate = NEW_C_HEAP_ARRAY(double, length); 98 _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num);
89 if (_surv_rate == NULL) { 99 if (_surv_rate == NULL) {
90 vm_exit_out_of_memory(sizeof(double) * length, 100 vm_exit_out_of_memory(sizeof(double) * _region_num,
91 "Not enough space for surv rate array."); 101 "Not enough space for surv rate array.");
92 } 102 }
93 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, length); 103 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num);
94 if (_accum_surv_rate_pred == NULL) { 104 if (_accum_surv_rate_pred == NULL) {
95 vm_exit_out_of_memory(sizeof(double) * length, 105 vm_exit_out_of_memory(sizeof(double) * _region_num,
96 "Not enough space for accum surv rate pred array."); 106 "Not enough space for accum surv rate pred array.");
97 } 107 }
98 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, length); 108 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num);
99 if (_surv_rate == NULL) { 109 if (_surv_rate == NULL) {
100 vm_exit_out_of_memory(sizeof(TruncatedSeq*) * length, 110 vm_exit_out_of_memory(sizeof(TruncatedSeq*) * _region_num,
101 "Not enough space for surv rate pred array."); 111 "Not enough space for surv rate pred array.");
102 } 112 }
103 113
104 for (size_t i = 0; i < _array_length; ++i) 114 for (size_t i = 0; i < _stats_arrays_length; ++i)
105 _surv_rate_pred[i] = old_surv_rate_pred[i]; 115 _surv_rate_pred[i] = old_surv_rate_pred[i];
106 116
107 #if 0 117 #if 0
108 gclog_or_tty->print_cr("stop adding regions, new seqs %d to %d", 118 gclog_or_tty->print_cr("[%s] stop adding regions, new seqs %d to %d",
109 _array_length, length - 1); 119 _name, _array_length, _region_num - 1);
110 #endif // 0 120 #endif // 0
111 121
112 for (size_t i = _array_length; i < length; ++i) { 122 for (size_t i = _stats_arrays_length; i < _region_num; ++i) {
113 _surv_rate_pred[i] = new TruncatedSeq(10); 123 _surv_rate_pred[i] = new TruncatedSeq(10);
114 // _surv_rate_pred[i]->add(last_pred); 124 // _surv_rate_pred[i]->add(last_pred);
115 } 125 }
116 126
117 _array_length = length; 127 _stats_arrays_length = _region_num;
118 128
119 if (old_surv_rate != NULL) 129 if (old_surv_rate != NULL)
120 FREE_C_HEAP_ARRAY(double, old_surv_rate); 130 FREE_C_HEAP_ARRAY(double, old_surv_rate);
121 if (old_accum_surv_rate_pred != NULL) 131 if (old_accum_surv_rate_pred != NULL)
122 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred); 132 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred);
123 if (old_surv_rate_pred != NULL) 133 if (old_surv_rate_pred != NULL)
124 FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred); 134 FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred);
125 } 135 }
126 136
127 for (size_t i = 0; i < _array_length; ++i) 137 for (size_t i = 0; i < _stats_arrays_length; ++i)
128 _surv_rate[i] = 0.0; 138 _surv_rate[i] = 0.0;
129 } 139 }
130 140
131 double 141 double
132 SurvRateGroup::accum_surv_rate(size_t adjustment) { 142 SurvRateGroup::accum_surv_rate(size_t adjustment) {
133 // we might relax this one in the future... 143 // we might relax this one in the future...
134 guarantee( adjustment == 0 || adjustment == 1, "pre-condition" ); 144 guarantee( adjustment == 0 || adjustment == 1, "pre-condition" );
135 145
136 double ret = _accum_surv_rate; 146 double ret = _accum_surv_rate;
137 if (adjustment > 0) { 147 if (adjustment > 0) {
138 TruncatedSeq* seq = get_seq(_curr_length+1); 148 TruncatedSeq* seq = get_seq(_region_num+1);
139 double surv_rate = _g1p->get_new_prediction(seq); 149 double surv_rate = _g1p->get_new_prediction(seq);
140 ret += surv_rate; 150 ret += surv_rate;
141 } 151 }
142 152
143 return ret; 153 return ret;
144 } 154 }
145 155
146 int 156 int
147 SurvRateGroup::next_age_index() { 157 SurvRateGroup::next_age_index() {
148 TruncatedSeq* seq = get_seq(_curr_length); 158 TruncatedSeq* seq = get_seq(_region_num);
149 double surv_rate = _g1p->get_new_prediction(seq); 159 double surv_rate = _g1p->get_new_prediction(seq);
150 _accum_surv_rate += surv_rate; 160 _accum_surv_rate += surv_rate;
151 161
152 ++_curr_length; 162 ++_region_num;
153 return (int) ++_all_regions_allocated; 163 return (int) ++_all_regions_allocated;
154 } 164 }
155 165
156 void 166 void
157 SurvRateGroup::record_scan_only_prefix(size_t scan_only_prefix) { 167 SurvRateGroup::record_scan_only_prefix(size_t scan_only_prefix) {
158 guarantee( scan_only_prefix <= _curr_length, "pre-condition" ); 168 guarantee( scan_only_prefix <= _region_num, "pre-condition" );
159 _scan_only_prefix = scan_only_prefix; 169 _scan_only_prefix = scan_only_prefix;
160 } 170 }
161 171
162 void 172 void
163 SurvRateGroup::record_surviving_words(int age_in_group, size_t surv_words) { 173 SurvRateGroup::record_surviving_words(int age_in_group, size_t surv_words) {
164 guarantee( 0 <= age_in_group && (size_t) age_in_group < _curr_length, 174 guarantee( 0 <= age_in_group && (size_t) age_in_group < _region_num,
165 "pre-condition" ); 175 "pre-condition" );
166 guarantee( _surv_rate[age_in_group] <= 0.00001, 176 guarantee( _surv_rate[age_in_group] <= 0.00001,
167 "should only update each slot once" ); 177 "should only update each slot once" );
168 178
169 double surv_rate = (double) surv_words / (double) HeapRegion::GrainWords; 179 double surv_rate = (double) surv_words / (double) HeapRegion::GrainWords;
176 } 186 }
177 } 187 }
178 188
179 void 189 void
180 SurvRateGroup::all_surviving_words_recorded(bool propagate) { 190 SurvRateGroup::all_surviving_words_recorded(bool propagate) {
181 if (propagate && _curr_length > 0) { // conservative 191 if (propagate && _region_num > 0) { // conservative
182 double surv_rate = _surv_rate_pred[_curr_length-1]->last(); 192 double surv_rate = _surv_rate_pred[_region_num-1]->last();
183 193
184 #if 0 194 #if 0
185 gclog_or_tty->print_cr("propagating %1.2lf from %d to %d", 195 gclog_or_tty->print_cr("propagating %1.2lf from %d to %d",
186 surv_rate, _curr_length, _array_length - 1); 196 surv_rate, _curr_length, _array_length - 1);
187 #endif // 0 197 #endif // 0
188 198
189 for (size_t i = _curr_length; i < _array_length; ++i) { 199 for (size_t i = _region_num; i < _stats_arrays_length; ++i) {
190 guarantee( _surv_rate[i] <= 0.00001, 200 guarantee( _surv_rate[i] <= 0.00001,
191 "the slot should not have been updated" ); 201 "the slot should not have been updated" );
192 _surv_rate_pred[i]->add(surv_rate); 202 _surv_rate_pred[i]->add(surv_rate);
193 } 203 }
194 } 204 }
195 205
196 double accum = 0.0; 206 double accum = 0.0;
197 double pred = 0.0; 207 double pred = 0.0;
198 for (size_t i = 0; i < _array_length; ++i) { 208 for (size_t i = 0; i < _stats_arrays_length; ++i) {
199 pred = _g1p->get_new_prediction(_surv_rate_pred[i]); 209 pred = _g1p->get_new_prediction(_surv_rate_pred[i]);
200 if (pred > 1.0) pred = 1.0; 210 if (pred > 1.0) pred = 1.0;
201 accum += pred; 211 accum += pred;
202 _accum_surv_rate_pred[i] = accum; 212 _accum_surv_rate_pred[i] = accum;
203 // gclog_or_tty->print_cr("age %3d, accum %10.2lf", i, accum); 213 // gclog_or_tty->print_cr("age %3d, accum %10.2lf", i, accum);
207 217
208 #ifndef PRODUCT 218 #ifndef PRODUCT
209 void 219 void
210 SurvRateGroup::print() { 220 SurvRateGroup::print() {
211 gclog_or_tty->print_cr("Surv Rate Group: %s (%d entries, %d scan-only)", 221 gclog_or_tty->print_cr("Surv Rate Group: %s (%d entries, %d scan-only)",
212 _name, _curr_length, _scan_only_prefix); 222 _name, _region_num, _scan_only_prefix);
213 for (size_t i = 0; i < _curr_length; ++i) { 223 for (size_t i = 0; i < _region_num; ++i) {
214 gclog_or_tty->print_cr(" age %4d surv rate %6.2lf %% pred %6.2lf %%%s", 224 gclog_or_tty->print_cr(" age %4d surv rate %6.2lf %% pred %6.2lf %%%s",
215 i, _surv_rate[i] * 100.0, 225 i, _surv_rate[i] * 100.0,
216 _g1p->get_new_prediction(_surv_rate_pred[i]) * 100.0, 226 _g1p->get_new_prediction(_surv_rate_pred[i]) * 100.0,
217 (i < _scan_only_prefix) ? " S-O" : " "); 227 (i < _scan_only_prefix) ? " S-O" : " ");
218 } 228 }