34
34
#include " runtime/java.hpp"
35
35
#include " runtime/thread.hpp"
36
36
#include " utilities/debug.hpp"
37
+ #include " utilities/formatBuffer.hpp"
37
38
#include " utilities/globalDefinitions.hpp"
38
39
#include " utilities/pair.hpp"
39
40
#include < math.h>
@@ -183,8 +184,16 @@ STATIC_ASSERT(max_yellow_zone <= max_red_zone);
183
184
// For logging zone values, ensuring consistency of level and tags.
184
185
#define LOG_ZONES (...) log_debug( CTRL_TAGS )(__VA_ARGS__)
185
186
186
- static size_t buffers_to_cards (size_t value) {
187
- return value * G1UpdateBufferSize;
187
+ // Convert configuration values in units of buffers to number of cards.
188
+ static size_t configuration_buffers_to_cards (size_t value, const char * value_name) {
189
+ if (value == 0 ) return 0 ;
190
+ size_t res = value * G1UpdateBufferSize;
191
+
192
+ if (res / value != G1UpdateBufferSize) { // Check overflow
193
+ vm_exit_during_initialization (err_msg (" configuration_buffers_to_cards: "
194
+ " (%s = " SIZE_FORMAT " ) * (G1UpdateBufferSize = " SIZE_FORMAT " ) overflow!" , value_name, value, G1UpdateBufferSize));
195
+ }
196
+ return res;
188
197
}
189
198
190
199
// Package for pair of refinement thread activation and deactivation
@@ -206,7 +215,7 @@ static Thresholds calc_thresholds(size_t green_zone,
206
215
// doing any processing, as that might lead to significantly more
207
216
// than green_zone buffers to be processed during pause. So limit
208
217
// to an extra half buffer per pause-time processing thread.
209
- step = MIN2 (step, buffers_to_cards (ParallelGCThreads) / 2.0 );
218
+ step = MIN2 (step, configuration_buffers_to_cards (ParallelGCThreads, " ParallelGCThreads " ) / 2.0 );
210
219
}
211
220
size_t activate_offset = static_cast <size_t >(ceil (step * (worker_id + 1 )));
212
221
size_t deactivate_offset = static_cast <size_t >(floor (step * worker_id));
@@ -232,7 +241,7 @@ jint G1ConcurrentRefine::initialize() {
232
241
}
233
242
234
243
static size_t calc_min_yellow_zone_size () {
235
- size_t step = buffers_to_cards (G1ConcRefinementThresholdStep);
244
+ size_t step = configuration_buffers_to_cards (G1ConcRefinementThresholdStep, " G1ConcRefinementThresholdStep " );
236
245
uint n_workers = G1ConcurrentRefine::max_num_threads ();
237
246
if ((max_yellow_zone / step) < n_workers) {
238
247
return max_yellow_zone;
@@ -243,15 +252,17 @@ static size_t calc_min_yellow_zone_size() {
243
252
244
253
static size_t calc_init_green_zone () {
245
254
size_t green = G1ConcRefinementGreenZone;
255
+ const char * name = " G1ConcRefinementGreenZone" ;
246
256
if (FLAG_IS_DEFAULT (G1ConcRefinementGreenZone)) {
247
257
green = ParallelGCThreads;
258
+ name = " ParallelGCThreads" ;
248
259
}
249
- green = buffers_to_cards (green);
260
+ green = configuration_buffers_to_cards (green, name );
250
261
return MIN2 (green, max_green_zone);
251
262
}
252
263
253
264
static size_t calc_init_yellow_zone (size_t green, size_t min_size) {
254
- size_t config = buffers_to_cards (G1ConcRefinementYellowZone);
265
+ size_t config = configuration_buffers_to_cards (G1ConcRefinementYellowZone, " G1ConcRefinementYellowZone " );
255
266
size_t size = 0 ;
256
267
if (FLAG_IS_DEFAULT (G1ConcRefinementYellowZone)) {
257
268
size = green * 2 ;
@@ -266,7 +277,7 @@ static size_t calc_init_yellow_zone(size_t green, size_t min_size) {
266
277
static size_t calc_init_red_zone (size_t green, size_t yellow) {
267
278
size_t size = yellow - green;
268
279
if (!FLAG_IS_DEFAULT (G1ConcRefinementRedZone)) {
269
- size_t config = buffers_to_cards (G1ConcRefinementRedZone);
280
+ size_t config = configuration_buffers_to_cards (G1ConcRefinementRedZone, " G1ConcRefinementRedZone " );
270
281
if (yellow < config) {
271
282
size = MAX2 (size, config - yellow);
272
283
}
0 commit comments