152 size = green * 2;
153 } else if (green < config) {
154 size = config - green;
155 }
156 size = MAX2(size, min_size);
157 size = MIN2(size, max_yellow_zone);
158 return MIN2(green + size, max_yellow_zone);
159 }
160
161 static size_t calc_init_red_zone(size_t green, size_t yellow) {
162 size_t size = yellow - green;
163 if (!FLAG_IS_DEFAULT(G1ConcRefinementRedZone)) {
164 size_t config = G1ConcRefinementRedZone;
165 if (yellow < config) {
166 size = MAX2(size, config - yellow);
167 }
168 }
169 return MIN2(yellow + size, max_red_zone);
170 }
171
172 ConcurrentG1Refine* ConcurrentG1Refine::create(CardTableEntryClosure* refine_closure,
173 jint* ecode) {
174 size_t min_yellow_zone_size = calc_min_yellow_zone_size();
175 size_t green_zone = calc_init_green_zone();
176 size_t yellow_zone = calc_init_yellow_zone(green_zone, min_yellow_zone_size);
177 size_t red_zone = calc_init_red_zone(green_zone, yellow_zone);
178
179 LOG_ZONES("Initial Refinement Zones: "
180 "green: " SIZE_FORMAT ", "
181 "yellow: " SIZE_FORMAT ", "
182 "red: " SIZE_FORMAT ", "
183 "min yellow size: " SIZE_FORMAT,
184 green_zone, yellow_zone, red_zone, min_yellow_zone_size);
185
186 ConcurrentG1Refine* cg1r = new ConcurrentG1Refine(green_zone,
187 yellow_zone,
188 red_zone,
189 min_yellow_zone_size);
190
191 if (cg1r == NULL) {
192 *ecode = JNI_ENOMEM;
193 vm_shutdown_during_initialization("Could not create ConcurrentG1Refine");
194 return NULL;
195 }
196
197 cg1r->_threads = NEW_C_HEAP_ARRAY_RETURN_NULL(ConcurrentG1RefineThread*, cg1r->_n_worker_threads, mtGC);
198 if (cg1r->_threads == NULL) {
199 *ecode = JNI_ENOMEM;
200 vm_shutdown_during_initialization("Could not allocate an array for ConcurrentG1RefineThread");
201 return NULL;
202 }
203
204 uint worker_id_offset = DirtyCardQueueSet::num_par_ids();
205
206 ConcurrentG1RefineThread *next = NULL;
207 for (uint i = cg1r->_n_worker_threads - 1; i != UINT_MAX; i--) {
208 Thresholds thresholds = calc_thresholds(green_zone, yellow_zone, i);
209 ConcurrentG1RefineThread* t =
210 new ConcurrentG1RefineThread(cg1r,
211 next,
212 refine_closure,
213 worker_id_offset,
214 i,
215 activation_level(thresholds),
216 deactivation_level(thresholds));
217 assert(t != NULL, "Conc refine should have been created");
218 if (t->osthread() == NULL) {
219 *ecode = JNI_ENOMEM;
220 vm_shutdown_during_initialization("Could not create ConcurrentG1RefineThread");
221 return NULL;
222 }
223
224 assert(t->cg1r() == cg1r, "Conc refine thread should refer to this");
225 cg1r->_threads[i] = t;
226 next = t;
227 }
228
229 cg1r->_sample_thread = new G1YoungRemSetSamplingThread();
230 if (cg1r->_sample_thread->osthread() == NULL) {
231 *ecode = JNI_ENOMEM;
232 vm_shutdown_during_initialization("Could not create G1YoungRemSetSamplingThread");
|
152 size = green * 2;
153 } else if (green < config) {
154 size = config - green;
155 }
156 size = MAX2(size, min_size);
157 size = MIN2(size, max_yellow_zone);
158 return MIN2(green + size, max_yellow_zone);
159 }
160
161 static size_t calc_init_red_zone(size_t green, size_t yellow) {
162 size_t size = yellow - green;
163 if (!FLAG_IS_DEFAULT(G1ConcRefinementRedZone)) {
164 size_t config = G1ConcRefinementRedZone;
165 if (yellow < config) {
166 size = MAX2(size, config - yellow);
167 }
168 }
169 return MIN2(yellow + size, max_red_zone);
170 }
171
172 ConcurrentG1Refine* ConcurrentG1Refine::create(jint* ecode) {
173 size_t min_yellow_zone_size = calc_min_yellow_zone_size();
174 size_t green_zone = calc_init_green_zone();
175 size_t yellow_zone = calc_init_yellow_zone(green_zone, min_yellow_zone_size);
176 size_t red_zone = calc_init_red_zone(green_zone, yellow_zone);
177
178 LOG_ZONES("Initial Refinement Zones: "
179 "green: " SIZE_FORMAT ", "
180 "yellow: " SIZE_FORMAT ", "
181 "red: " SIZE_FORMAT ", "
182 "min yellow size: " SIZE_FORMAT,
183 green_zone, yellow_zone, red_zone, min_yellow_zone_size);
184
185 ConcurrentG1Refine* cg1r = new ConcurrentG1Refine(green_zone,
186 yellow_zone,
187 red_zone,
188 min_yellow_zone_size);
189
190 if (cg1r == NULL) {
191 *ecode = JNI_ENOMEM;
192 vm_shutdown_during_initialization("Could not create ConcurrentG1Refine");
193 return NULL;
194 }
195
196 cg1r->_threads = NEW_C_HEAP_ARRAY_RETURN_NULL(ConcurrentG1RefineThread*, cg1r->_n_worker_threads, mtGC);
197 if (cg1r->_threads == NULL) {
198 *ecode = JNI_ENOMEM;
199 vm_shutdown_during_initialization("Could not allocate an array for ConcurrentG1RefineThread");
200 return NULL;
201 }
202
203 uint worker_id_offset = DirtyCardQueueSet::num_par_ids();
204
205 ConcurrentG1RefineThread *next = NULL;
206 for (uint i = cg1r->_n_worker_threads - 1; i != UINT_MAX; i--) {
207 Thresholds thresholds = calc_thresholds(green_zone, yellow_zone, i);
208 ConcurrentG1RefineThread* t =
209 new ConcurrentG1RefineThread(cg1r,
210 next,
211 worker_id_offset,
212 i,
213 activation_level(thresholds),
214 deactivation_level(thresholds));
215 assert(t != NULL, "Conc refine should have been created");
216 if (t->osthread() == NULL) {
217 *ecode = JNI_ENOMEM;
218 vm_shutdown_during_initialization("Could not create ConcurrentG1RefineThread");
219 return NULL;
220 }
221
222 assert(t->cg1r() == cg1r, "Conc refine thread should refer to this");
223 cg1r->_threads[i] = t;
224 next = t;
225 }
226
227 cg1r->_sample_thread = new G1YoungRemSetSamplingThread();
228 if (cg1r->_sample_thread->osthread() == NULL) {
229 *ecode = JNI_ENOMEM;
230 vm_shutdown_during_initialization("Could not create G1YoungRemSetSamplingThread");
|