src/share/vm/gc_implementation/g1/survRateGroup.cpp

changeset 3641
2c0751569716
parent 2314
f95d63e2154a
child 3900
d2a62e0f25eb
equal deleted inserted replaced
3640:cf956638b844 3641:2c0751569716
1 /* 1 /*
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
36 _summary_surv_rates_len(summary_surv_rates_len), 36 _summary_surv_rates_len(summary_surv_rates_len),
37 _summary_surv_rates_max_len(0), 37 _summary_surv_rates_max_len(0),
38 _summary_surv_rates(NULL), 38 _summary_surv_rates(NULL),
39 _surv_rate(NULL), 39 _surv_rate(NULL),
40 _accum_surv_rate_pred(NULL), 40 _accum_surv_rate_pred(NULL),
41 _surv_rate_pred(NULL) 41 _surv_rate_pred(NULL),
42 { 42 _stats_arrays_length(0) {
43 reset(); 43 reset();
44 if (summary_surv_rates_len > 0) { 44 if (summary_surv_rates_len > 0) {
45 size_t length = summary_surv_rates_len; 45 size_t length = summary_surv_rates_len;
46 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length); 46 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length);
47 if (_summary_surv_rates == NULL) { 47 for (size_t i = 0; i < length; ++i) {
48 vm_exit_out_of_memory(sizeof(NumberSeq*) * length,
49 "Not enough space for surv rate summary");
50 }
51 for (size_t i = 0; i < length; ++i)
52 _summary_surv_rates[i] = new NumberSeq(); 48 _summary_surv_rates[i] = new NumberSeq();
49 }
53 } 50 }
54 51
55 start_adding_regions(); 52 start_adding_regions();
56 } 53 }
57 54
58 55 void SurvRateGroup::reset() {
59 void SurvRateGroup::reset()
60 {
61 _all_regions_allocated = 0; 56 _all_regions_allocated = 0;
62 _setup_seq_num = 0; 57 _setup_seq_num = 0;
63 _stats_arrays_length = 0;
64 _accum_surv_rate = 0.0; 58 _accum_surv_rate = 0.0;
65 _last_pred = 0.0; 59 _last_pred = 0.0;
66 // the following will set up the arrays with length 1 60 // the following will set up the arrays with length 1
67 _region_num = 1; 61 _region_num = 1;
62
63 // The call to stop_adding_regions() will use "new" to refill
64 // the _surv_rate_pred array, so we need to make sure to call
65 // "delete".
66 for (size_t i = 0; i < _stats_arrays_length; ++i) {
67 delete _surv_rate_pred[i];
68 }
69 _stats_arrays_length = 0;
70
68 stop_adding_regions(); 71 stop_adding_regions();
69 guarantee( _stats_arrays_length == 1, "invariant" ); 72 guarantee( _stats_arrays_length == 1, "invariant" );
70 guarantee( _surv_rate_pred[0] != NULL, "invariant" ); 73 guarantee( _surv_rate_pred[0] != NULL, "invariant" );
71 _surv_rate_pred[0]->add(0.4); 74 _surv_rate_pred[0]->add(0.4);
72 all_surviving_words_recorded(false); 75 all_surviving_words_recorded(false);
73 _region_num = 0; 76 _region_num = 0;
74 } 77 }
75 78
76
77 void 79 void
78 SurvRateGroup::start_adding_regions() { 80 SurvRateGroup::start_adding_regions() {
79 _setup_seq_num = _stats_arrays_length; 81 _setup_seq_num = _stats_arrays_length;
80 _region_num = 0; 82 _region_num = 0;
81 _accum_surv_rate = 0.0; 83 _accum_surv_rate = 0.0;
82
83 #if 0
84 gclog_or_tty->print_cr("[%s] start adding regions, seq num %d, length %d",
85 _name, _setup_seq_num, _region_num);
86 #endif // 0
87 } 84 }
88 85
89 void 86 void
90 SurvRateGroup::stop_adding_regions() { 87 SurvRateGroup::stop_adding_regions() {
91
92 #if 0
93 gclog_or_tty->print_cr("[%s] stop adding regions, length %d", _name, _region_num);
94 #endif // 0
95
96 if (_region_num > _stats_arrays_length) { 88 if (_region_num > _stats_arrays_length) {
97 double* old_surv_rate = _surv_rate; 89 double* old_surv_rate = _surv_rate;
98 double* old_accum_surv_rate_pred = _accum_surv_rate_pred; 90 double* old_accum_surv_rate_pred = _accum_surv_rate_pred;
99 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred; 91 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred;
100 92
101 _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num); 93 _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num);
102 if (_surv_rate == NULL) {
103 vm_exit_out_of_memory(sizeof(double) * _region_num,
104 "Not enough space for surv rate array.");
105 }
106 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num); 94 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num);
107 if (_accum_surv_rate_pred == NULL) {
108 vm_exit_out_of_memory(sizeof(double) * _region_num,
109 "Not enough space for accum surv rate pred array.");
110 }
111 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num); 95 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num);
112 if (_surv_rate == NULL) { 96
113 vm_exit_out_of_memory(sizeof(TruncatedSeq*) * _region_num, 97 for (size_t i = 0; i < _stats_arrays_length; ++i) {
114 "Not enough space for surv rate pred array.");
115 }
116
117 for (size_t i = 0; i < _stats_arrays_length; ++i)
118 _surv_rate_pred[i] = old_surv_rate_pred[i]; 98 _surv_rate_pred[i] = old_surv_rate_pred[i];
119 99 }
120 #if 0
121 gclog_or_tty->print_cr("[%s] stop adding regions, new seqs %d to %d",
122 _name, _array_length, _region_num - 1);
123 #endif // 0
124
125 for (size_t i = _stats_arrays_length; i < _region_num; ++i) { 100 for (size_t i = _stats_arrays_length; i < _region_num; ++i) {
126 _surv_rate_pred[i] = new TruncatedSeq(10); 101 _surv_rate_pred[i] = new TruncatedSeq(10);
127 // _surv_rate_pred[i]->add(last_pred);
128 } 102 }
129 103
130 _stats_arrays_length = _region_num; 104 _stats_arrays_length = _region_num;
131 105
132 if (old_surv_rate != NULL) 106 if (old_surv_rate != NULL) {
133 FREE_C_HEAP_ARRAY(double, old_surv_rate); 107 FREE_C_HEAP_ARRAY(double, old_surv_rate);
134 if (old_accum_surv_rate_pred != NULL) 108 }
109 if (old_accum_surv_rate_pred != NULL) {
135 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred); 110 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred);
136 if (old_surv_rate_pred != NULL) 111 }
137 FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred); 112 if (old_surv_rate_pred != NULL) {
138 } 113 FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred);
139 114 }
140 for (size_t i = 0; i < _stats_arrays_length; ++i) 115 }
116
117 for (size_t i = 0; i < _stats_arrays_length; ++i) {
141 _surv_rate[i] = 0.0; 118 _surv_rate[i] = 0.0;
119 }
142 } 120 }
143 121
144 double 122 double
145 SurvRateGroup::accum_surv_rate(size_t adjustment) { 123 SurvRateGroup::accum_surv_rate(size_t adjustment) {
146 // we might relax this one in the future... 124 // we might relax this one in the future...
185 163
186 void 164 void
187 SurvRateGroup::all_surviving_words_recorded(bool propagate) { 165 SurvRateGroup::all_surviving_words_recorded(bool propagate) {
188 if (propagate && _region_num > 0) { // conservative 166 if (propagate && _region_num > 0) { // conservative
189 double surv_rate = _surv_rate_pred[_region_num-1]->last(); 167 double surv_rate = _surv_rate_pred[_region_num-1]->last();
190
191 #if 0
192 gclog_or_tty->print_cr("propagating %1.2lf from %d to %d",
193 surv_rate, _curr_length, _array_length - 1);
194 #endif // 0
195
196 for (size_t i = _region_num; i < _stats_arrays_length; ++i) { 168 for (size_t i = _region_num; i < _stats_arrays_length; ++i) {
197 guarantee( _surv_rate[i] <= 0.00001, 169 guarantee( _surv_rate[i] <= 0.00001,
198 "the slot should not have been updated" ); 170 "the slot should not have been updated" );
199 _surv_rate_pred[i]->add(surv_rate); 171 _surv_rate_pred[i]->add(surv_rate);
200 } 172 }

mercurial