@@ -1327,7 +1327,8 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi
1327
1327
size_t old_collector_regions = 0 ;
1328
1328
size_t old_collector_used = 0 ;
1329
1329
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++) {
1331
1332
ShenandoahHeapRegion* region = _heap->get_region (idx);
1332
1333
if (region->is_trash ()) {
1333
1334
// 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
1412
1413
old_collector_leftmost, old_collector_rightmost, old_collector_leftmost_empty, old_collector_rightmost_empty,
1413
1414
old_collector_regions, old_collector_used);
1414
1415
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,
1416
1419
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);
1419
1424
log_debug (gc)(" After find_regions_with_alloc_capacity(), Mutator range [" SSIZE_FORMAT " , " SSIZE_FORMAT " ],"
1420
1425
" Old Collector range [" SSIZE_FORMAT " , " SSIZE_FORMAT " ]" ,
1421
1426
_partitions.leftmost (ShenandoahFreeSetPartitionId::Mutator),
@@ -1532,8 +1537,23 @@ void ShenandoahFreeSet::establish_generation_sizes(size_t young_region_count, si
1532
1537
ShenandoahYoungGeneration* young_gen = heap->young_generation ();
1533
1538
size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes ();
1534
1539
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 );
1537
1557
}
1538
1558
}
1539
1559
@@ -1700,12 +1720,12 @@ void ShenandoahFreeSet::reserve_regions(size_t to_reserve, size_t to_reserve_old
1700
1720
}
1701
1721
1702
1722
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);
1704
1724
if (old_reserve < to_reserve_old) {
1705
1725
log_info (gc, free)(" Wanted " PROPERFMT " for old reserve, but only reserved: " PROPERFMT,
1706
1726
PROPERFMTARGS (to_reserve_old), PROPERFMTARGS (old_reserve));
1707
1727
}
1708
- size_t reserve = _partitions.capacity_of (ShenandoahFreeSetPartitionId::Collector);
1728
+ size_t reserve = _partitions.available_in (ShenandoahFreeSetPartitionId::Collector);
1709
1729
if (reserve < to_reserve) {
1710
1730
log_debug (gc)(" Wanted " PROPERFMT " for young reserve, but only reserved: " PROPERFMT,
1711
1731
PROPERFMTARGS (to_reserve), PROPERFMTARGS (reserve));
0 commit comments