Skip to content

Commit 804a8fa

Browse files
author
Ivan Walulya
committed
8352765: G1CollectedHeap::expand_and_allocate() may fail to allocate even after heap expansion succeeds
Reviewed-by: tschatzl, manc
1 parent 22f630c commit 804a8fa

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/hotspot/share/gc/g1/g1Policy.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)