@@ -340,41 +340,47 @@ uint G1Policy::calculate_young_target_length(uint desired_young_length) const {
340
340
_reserve_regions,
341
341
max_to_eat_into_reserve);
342
342
343
+ uint survivor_regions_count = _g1h->survivor_regions_count ();
344
+ uint desired_eden_length = desired_young_length - survivor_regions_count;
345
+ uint allocated_eden_length = allocated_young_length - survivor_regions_count;
346
+
343
347
if (_free_regions_at_end_of_collection <= _reserve_regions) {
344
348
// Fully eat (or already eating) into the reserve, hand back at most absolute_min_length regions.
345
- uint receiving_young = MIN3 (_free_regions_at_end_of_collection,
346
- desired_young_length ,
349
+ uint receiving_eden = MIN3 (_free_regions_at_end_of_collection,
350
+ desired_eden_length ,
347
351
max_to_eat_into_reserve);
352
+ // Ensure that we provision for at least one Eden region.
353
+ receiving_eden = MAX2 (receiving_eden, 1u );
348
354
// We could already have allocated more regions than what we could get
349
355
// above.
350
- receiving_additional_eden = allocated_young_length < receiving_young ?
351
- receiving_young - allocated_young_length : 0 ;
356
+ receiving_additional_eden = allocated_eden_length < receiving_eden ?
357
+ receiving_eden - allocated_eden_length : 0 ;
352
358
353
359
log_trace (gc, ergo, heap)(" Young target length: Fully eat into reserve "
354
- " receiving young %u receiving additional eden %u" ,
355
- receiving_young,
356
- receiving_additional_eden);
357
- } else if (_free_regions_at_end_of_collection < (desired_young_length + _reserve_regions)) {
360
+ " receiving eden %u receiving additional eden %u" ,
361
+ receiving_eden, receiving_additional_eden);
362
+ } else if (_free_regions_at_end_of_collection < (desired_eden_length + _reserve_regions)) {
358
363
// Partially eat into the reserve, at most max_to_eat_into_reserve regions.
359
364
uint free_outside_reserve = _free_regions_at_end_of_collection - _reserve_regions;
360
- assert (free_outside_reserve < desired_young_length ,
365
+ assert (free_outside_reserve < desired_eden_length ,
361
366
" must be %u %u" ,
362
- free_outside_reserve, desired_young_length );
367
+ free_outside_reserve, desired_eden_length );
363
368
364
- uint receiving_within_reserve = MIN2 (desired_young_length - free_outside_reserve,
369
+ uint receiving_within_reserve = MIN2 (desired_eden_length - free_outside_reserve,
365
370
max_to_eat_into_reserve);
366
- uint receiving_young = free_outside_reserve + receiving_within_reserve;
371
+ uint receiving_eden = free_outside_reserve + receiving_within_reserve;
372
+
367
373
// Again, we could have already allocated more than we could get.
368
- receiving_additional_eden = allocated_young_length < receiving_young ?
369
- receiving_young - allocated_young_length : 0 ;
374
+ receiving_additional_eden = allocated_eden_length < receiving_eden ?
375
+ receiving_eden - allocated_eden_length : 0 ;
370
376
371
377
log_trace (gc, ergo, heap)(" Young target length: Partially eat into reserve "
372
378
" free outside reserve %u "
373
379
" receiving within reserve %u "
374
- " receiving young %u "
380
+ " receiving eden %u "
375
381
" receiving additional eden %u" ,
376
382
free_outside_reserve, receiving_within_reserve,
377
- receiving_young , receiving_additional_eden);
383
+ receiving_eden , receiving_additional_eden);
378
384
} else {
379
385
// No need to use the reserve.
380
386
receiving_additional_eden = desired_young_length - allocated_young_length;
0 commit comments