Skip to content

Commit 1a7d597

Browse files
committed
8339960: GenShen: Fix inconsistencies in generational Shenandoah behavior
Reviewed-by: wkemper
1 parent b7405b1 commit 1a7d597

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,8 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi
13271327
size_t old_collector_regions = 0;
13281328
size_t old_collector_used = 0;
13291329

1330-
for (size_t idx = 0; idx < _heap->num_regions(); idx++) {
1330+
size_t num_regions = _heap->num_regions();
1331+
for (size_t idx = 0; idx < num_regions; idx++) {
13311332
ShenandoahHeapRegion* region = _heap->get_region(idx);
13321333
if (region->is_trash()) {
13331334
// Trashed regions represent regions that had been in the collection partition but have not yet been "cleaned up".
@@ -1412,10 +1413,14 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi
14121413
old_collector_leftmost, old_collector_rightmost, old_collector_leftmost_empty, old_collector_rightmost_empty,
14131414
old_collector_regions, old_collector_used);
14141415

1415-
_partitions.establish_mutator_intervals(mutator_leftmost, mutator_rightmost, mutator_leftmost_empty, mutator_rightmost_empty,
1416+
idx_t rightmost_idx = (mutator_leftmost == max_regions)? -1: (idx_t) mutator_rightmost;
1417+
idx_t rightmost_empty_idx = (mutator_leftmost_empty == max_regions)? -1: (idx_t) mutator_rightmost_empty;
1418+
_partitions.establish_mutator_intervals(mutator_leftmost, rightmost_idx, mutator_leftmost_empty, rightmost_empty_idx,
14161419
mutator_regions, mutator_used);
1417-
_partitions.establish_old_collector_intervals(old_collector_leftmost, old_collector_rightmost, old_collector_leftmost_empty,
1418-
old_collector_rightmost_empty, old_collector_regions, old_collector_used);
1420+
rightmost_idx = (old_collector_leftmost == max_regions)? -1: (idx_t) old_collector_rightmost;
1421+
rightmost_empty_idx = (old_collector_leftmost_empty == max_regions)? -1: (idx_t) old_collector_rightmost_empty;
1422+
_partitions.establish_old_collector_intervals(old_collector_leftmost, rightmost_idx, old_collector_leftmost_empty,
1423+
rightmost_empty_idx, old_collector_regions, old_collector_used);
14191424
log_debug(gc)(" After find_regions_with_alloc_capacity(), Mutator range [" SSIZE_FORMAT ", " SSIZE_FORMAT "],"
14201425
" Old Collector range [" SSIZE_FORMAT ", " SSIZE_FORMAT "]",
14211426
_partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator),
@@ -1532,8 +1537,23 @@ void ShenandoahFreeSet::establish_generation_sizes(size_t young_region_count, si
15321537
ShenandoahYoungGeneration* young_gen = heap->young_generation();
15331538
size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes();
15341539

1535-
old_gen->set_capacity(old_region_count * region_size_bytes);
1536-
young_gen->set_capacity(young_region_count * region_size_bytes);
1540+
size_t original_old_capacity = old_gen->max_capacity();
1541+
size_t new_old_capacity = old_region_count * region_size_bytes;
1542+
size_t new_young_capacity = young_region_count * region_size_bytes;
1543+
old_gen->set_capacity(new_old_capacity);
1544+
young_gen->set_capacity(new_young_capacity);
1545+
1546+
if (new_old_capacity > original_old_capacity) {
1547+
size_t region_count = (new_old_capacity - original_old_capacity) / region_size_bytes;
1548+
log_info(gc)("Transfer " SIZE_FORMAT " region(s) from %s to %s, yielding increased size: " PROPERFMT,
1549+
region_count, young_gen->name(), old_gen->name(), PROPERFMTARGS(new_old_capacity));
1550+
} else if (new_old_capacity < original_old_capacity) {
1551+
size_t region_count = (original_old_capacity - new_old_capacity) / region_size_bytes;
1552+
log_info(gc)("Transfer " SIZE_FORMAT " region(s) from %s to %s, yielding increased size: " PROPERFMT,
1553+
region_count, old_gen->name(), young_gen->name(), PROPERFMTARGS(new_young_capacity));
1554+
}
1555+
// This balances generations, so clear any pending request to balance.
1556+
old_gen->set_region_balance(0);
15371557
}
15381558
}
15391559

@@ -1700,12 +1720,12 @@ void ShenandoahFreeSet::reserve_regions(size_t to_reserve, size_t to_reserve_old
17001720
}
17011721

17021722
if (LogTarget(Info, gc, free)::is_enabled()) {
1703-
size_t old_reserve = _partitions.capacity_of(ShenandoahFreeSetPartitionId::OldCollector);
1723+
size_t old_reserve = _partitions.available_in(ShenandoahFreeSetPartitionId::OldCollector);
17041724
if (old_reserve < to_reserve_old) {
17051725
log_info(gc, free)("Wanted " PROPERFMT " for old reserve, but only reserved: " PROPERFMT,
17061726
PROPERFMTARGS(to_reserve_old), PROPERFMTARGS(old_reserve));
17071727
}
1708-
size_t reserve = _partitions.capacity_of(ShenandoahFreeSetPartitionId::Collector);
1728+
size_t reserve = _partitions.available_in(ShenandoahFreeSetPartitionId::Collector);
17091729
if (reserve < to_reserve) {
17101730
log_debug(gc)("Wanted " PROPERFMT " for young reserve, but only reserved: " PROPERFMT,
17111731
PROPERFMTARGS(to_reserve), PROPERFMTARGS(reserve));

0 commit comments

Comments
 (0)