@@ -340,41 +340,47 @@ uint G1Policy::calculate_young_target_length(uint desired_young_length) const {
340340 _reserve_regions,
341341 max_to_eat_into_reserve);
342342
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+
343347 if (_free_regions_at_end_of_collection <= _reserve_regions) {
344348 // 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 ,
347351 max_to_eat_into_reserve);
352+ // Ensure that we provision for at least one Eden region.
353+ receiving_eden = MAX2 (receiving_eden, 1u );
348354 // We could already have allocated more regions than what we could get
349355 // 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 ;
352358
353359 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)) {
358363 // Partially eat into the reserve, at most max_to_eat_into_reserve regions.
359364 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 ,
361366 " must be %u %u" ,
362- free_outside_reserve, desired_young_length );
367+ free_outside_reserve, desired_eden_length );
363368
364- uint receiving_within_reserve = MIN2 (desired_young_length - free_outside_reserve,
369+ uint receiving_within_reserve = MIN2 (desired_eden_length - free_outside_reserve,
365370 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+
367373 // 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 ;
370376
371377 log_trace (gc, ergo, heap)(" Young target length: Partially eat into reserve "
372378 " free outside reserve %u "
373379 " receiving within reserve %u "
374- " receiving young %u "
380+ " receiving eden %u "
375381 " receiving additional eden %u" ,
376382 free_outside_reserve, receiving_within_reserve,
377- receiving_young , receiving_additional_eden);
383+ receiving_eden , receiving_additional_eden);
378384 } else {
379385 // No need to use the reserve.
380386 receiving_additional_eden = desired_young_length - allocated_young_length;
0 commit comments