Skip to content

8365880: Shenandoah: Unify memory usage accounting in ShenandoahFreeSet #26867

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 94 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
702710e
Improve documentation of how Evac-OOM Protocol works
kdnilsen Jan 12, 2024
61b575f
Merge branch 'openjdk:master' into master
kdnilsen Jan 17, 2024
51d056f
Revert "Improve documentation of how Evac-OOM Protocol works"
kdnilsen Jan 17, 2024
ba98e42
Merge branch 'openjdk:master' into master
kdnilsen Jan 23, 2024
441487c
Merge branch 'openjdk:master' into master
kdnilsen Jan 25, 2024
dafc363
Merge branch 'openjdk:master' into master
kdnilsen Feb 2, 2024
c4c252e
Merge branch 'openjdk:master' into master
kdnilsen Feb 21, 2024
41ba86a
Merge branch 'openjdk:master' into master
kdnilsen Feb 28, 2024
f215a70
Merge branch 'openjdk:master' into master
kdnilsen Mar 1, 2024
4d6b5cd
Merge branch 'openjdk:master' into master
kdnilsen Mar 26, 2024
7fe605f
Merge branch 'openjdk:master' into master
kdnilsen Mar 28, 2024
2e224f6
Merge branch 'openjdk:master' into master
kdnilsen Apr 30, 2024
46ad5c6
Merge branch 'openjdk:master' into master
kdnilsen May 3, 2024
9a1989d
Merge branch 'openjdk:master' into master
kdnilsen May 9, 2024
4126c22
Merge branch 'openjdk:master' into master
kdnilsen Jun 12, 2024
981692e
Merge branch 'openjdk:master' into master
kdnilsen Jun 14, 2024
3a67b1f
Make GC logging less verbose
kdnilsen Jun 14, 2024
3692312
Revert "Make GC logging less verbose"
kdnilsen Jun 19, 2024
045590b
Merge branch 'openjdk:master' into master
kdnilsen Jun 26, 2024
fbbd88c
Merge branch 'openjdk:master' into master
kdnilsen Jul 8, 2024
7e0edf0
Merge branch 'openjdk:master' into master
kdnilsen Sep 12, 2024
3525369
Merge branch 'openjdk:master' into master
kdnilsen Sep 26, 2024
fe0da51
Merge branch 'openjdk:master' into master
kdnilsen Nov 6, 2024
db12fe5
Merge branch 'openjdk:master' into master
kdnilsen Dec 6, 2024
0440bae
Merge branch 'openjdk:master' into master
kdnilsen Jan 16, 2025
3bdc022
Merge branch 'openjdk:master' into master
kdnilsen Jan 19, 2025
1ee2ff1
Merge branch 'openjdk:master' into master
kdnilsen Feb 7, 2025
e6e772f
Merge branch 'openjdk:master' into master
kdnilsen Feb 27, 2025
c5a159e
Merge branch 'openjdk:master' into master
kdnilsen Mar 18, 2025
e7ca4f8
Merge branch 'openjdk:master' into master
kdnilsen Mar 20, 2025
42a93c7
Merge branch 'openjdk:master' into master
kdnilsen Mar 27, 2025
3841ca6
Merge branch 'openjdk:master' into master
kdnilsen Apr 8, 2025
9386e90
Merge branch 'openjdk:master' into master
kdnilsen Apr 10, 2025
0252a5c
Merge branch 'openjdk:master' into master
kdnilsen Apr 22, 2025
e029b8c
Merge branch 'openjdk:master' into master
kdnilsen May 8, 2025
72ad42e
Merge branch 'openjdk:master' into master
kdnilsen Jun 12, 2025
c5f212d
Add support for more bookkeeping in ShenandoahFreeSet
kdnilsen Jun 16, 2025
428145b
add freeset accounting of humongous waste
kdnilsen Jun 17, 2025
27d2e1c
Use free-set implementation of humongous waste
kdnilsen Jun 20, 2025
34bd23a
Incremental progress with redundant calculations and consistency checks
kdnilsen Jul 2, 2025
5ee691f
Fix several bugs in freeset accounting
kdnilsen Jul 8, 2025
39ba805
Some progress
kdnilsen Jul 9, 2025
1eb09e5
more progress
kdnilsen Jul 9, 2025
49cc11f
try_allocate_in decrements empty region count
kdnilsen Jul 15, 2025
14524cd
fix to global affiliated counts
kdnilsen Jul 15, 2025
2459829
fix assert
kdnilsen Jul 15, 2025
4284848
fix multiple accounting errors
kdnilsen Jul 17, 2025
620dcfc
more bug fixes and more asserts
kdnilsen Jul 20, 2025
faf2006
capacity accounting adjusts available
kdnilsen Jul 20, 2025
4121ce9
remove redundant calls to adjust available
kdnilsen Jul 20, 2025
3f7042f
Account for PiP padding in usage
kdnilsen Jul 21, 2025
c71564b
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Jul 21, 2025
0e7b91f
fix remaining known accounting bug
kdnilsen Jul 22, 2025
d299ec2
disable debug instrumentation
kdnilsen Jul 22, 2025
4afb041
special handling for non-generational try_allocate_in()
kdnilsen Jul 22, 2025
42abc63
Count waste as part of generation used
kdnilsen Jul 23, 2025
fec9d3f
more bug fixes
kdnilsen Jul 26, 2025
e2fb4d2
more fixes to humongous waste accounting
kdnilsen Jul 28, 2025
ff7a611
Fix old triggering with respect to humongous waste
kdnilsen Jul 28, 2025
90a515f
verifier counts humongous waste as used
kdnilsen Jul 28, 2025
702958a
fix verification account of cset and trashed regions
kdnilsen Jul 28, 2025
2c7e880
register the fill object when padding a retired old region
kdnilsen Jul 29, 2025
ff91412
register retired region fill object and disable pad-for-pip adjustmen…
kdnilsen Jul 30, 2025
ebe7b32
Do not double-count free as used for humongous
kdnilsen Jul 31, 2025
09d5a95
shrink interval for range cannot assume contiguous regions
kdnilsen Aug 1, 2025
3422f25
adjustments to promotion in place bookkeeping
kdnilsen Aug 2, 2025
9e4224f
recompute young_evac_reserve after selecting pip regions
kdnilsen Aug 3, 2025
d67cd99
fix up accounting for pip padding
kdnilsen Aug 3, 2025
b573d52
fix qualification test for pip fill object
kdnilsen Aug 3, 2025
94cf249
Retire regions that are prepared for promote in place
kdnilsen Aug 5, 2025
7825715
Disable generation accounting
kdnilsen Aug 8, 2025
ef47c14
Fix compile-time error
kdnilsen Aug 8, 2025
e0751ca
fix byte vs word comparison error
kdnilsen Aug 8, 2025
4e68123
fix floating reserves for GLOBAL GC
kdnilsen Aug 9, 2025
e13ec3d
add instrumentation to debug TestChurnNotifications failure
kdnilsen Aug 10, 2025
b788d2b
Add anticipated humongous waste into TestChurnNotifications expected …
kdnilsen Aug 11, 2025
c534740
Disable debug instrumentation
kdnilsen Aug 11, 2025
c365253
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Aug 12, 2025
aefb7a0
Fix accounting error in allocate_contiguous
kdnilsen Aug 13, 2025
8c72e9d
fix top for last humongous region in alloc_contiguous
kdnilsen Aug 13, 2025
f2ff722
a few more bookkeeping fixes in allocate_contiguous
kdnilsen Aug 13, 2025
a8ac8cc
Fix googletest
kdnilsen Aug 14, 2025
d02a37a
do not query allocation runway during heap initialization
kdnilsen Aug 14, 2025
a5ee645
move set_capacity() into ShenandoahOldGeneration
kdnilsen Aug 15, 2025
7953f9a
fix support for googletest ShenandoahOldHeuristics after more testing
kdnilsen Aug 15, 2025
3ef98a8
Validate SoftMaxHeapSize before Memory Init
kdnilsen Aug 15, 2025
e33cf90
Add GenShen no-tlab test and increase test timeouts
kdnilsen Aug 18, 2025
d3c75fc
do not fill remnant memory when retiring regions
kdnilsen Aug 20, 2025
938efac
do not fill remnant memory of retired heap regions
kdnilsen Aug 20, 2025
ee1b7da
Remove debug instrumentation
kdnilsen Aug 20, 2025
b5b5c40
fix white space
kdnilsen Aug 20, 2025
51d9e05
remove unused variable
kdnilsen Aug 20, 2025
45555d0
Refinements to appease MS Windows compiler
kdnilsen Aug 20, 2025
c85a454
add override qualifier
kdnilsen Aug 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/shared/gc_globals.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@
\
product(size_t, SoftMaxHeapSize, 0, MANAGEABLE, \
"Soft limit for maximum heap size (in bytes)") \
constraint(SoftMaxHeapSizeConstraintFunc,AfterMemoryInit) \
constraint(SoftMaxHeapSizeConstraintFunc,AfterErgo) \
\
product(size_t, NewSize, ScaleForWordSize(1*M), \
"Initial new generation size (in bytes)") \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,10 @@ void ShenandoahGlobalHeuristics::choose_global_collection_set(ShenandoahCollecti
size_t min_garbage = (free_target > actual_free) ? (free_target - actual_free) : 0;

log_info(gc, ergo)("Adaptive CSet Selection for GLOBAL. Max Young Evacuation: %zu"
"%s, Max Old Evacuation: %zu%s, Actual Free: %zu%s.",
"%s, Max Old Evacuation: %zu%s, Max Either Evacuation: %zu%s, Actual Free: %zu%s.",
byte_size_in_proper_unit(max_young_cset), proper_unit_for_byte_size(max_young_cset),
byte_size_in_proper_unit(max_old_cset), proper_unit_for_byte_size(max_old_cset),
byte_size_in_proper_unit(unaffiliated_young_memory), proper_unit_for_byte_size(unaffiliated_young_memory),
byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free));

for (size_t idx = 0; idx < size; idx++) {
Expand Down Expand Up @@ -136,9 +137,8 @@ void ShenandoahGlobalHeuristics::choose_global_collection_set(ShenandoahCollecti
cset->add_region(r);
}
}

if (regions_transferred_to_old > 0) {
heap->generation_sizer()->force_transfer_to_old(regions_transferred_to_old);
assert(young_evac_reserve > regions_transferred_to_old * region_size_bytes, "young reserve cannot be negative");
heap->young_generation()->set_evacuation_reserve(young_evac_reserve - regions_transferred_to_old * region_size_bytes);
heap->old_generation()->set_evacuation_reserve(old_evac_reserve + regions_transferred_to_old * region_size_bytes);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -602,12 +602,12 @@ void ShenandoahOldHeuristics::set_trigger_if_old_is_fragmented(size_t first_old_
}

void ShenandoahOldHeuristics::set_trigger_if_old_is_overgrown() {
size_t old_used = _old_generation->used() + _old_generation->get_humongous_waste();
// used() includes humongous waste
size_t old_used = _old_generation->used();
size_t trigger_threshold = _old_generation->usage_trigger_threshold();
// Detects unsigned arithmetic underflow
assert(old_used <= _heap->capacity(),
"Old used (%zu, %zu) must not be more than heap capacity (%zu)",
_old_generation->used(), _old_generation->get_humongous_waste(), _heap->capacity());
"Old used (%zu) must not be more than heap capacity (%zu)", _old_generation->used(), _heap->capacity());
if (old_used > trigger_threshold) {
_growth_trigger = true;
}
Expand Down Expand Up @@ -679,7 +679,8 @@ bool ShenandoahOldHeuristics::should_start_gc() {
if (_growth_trigger) {
// Growth may be falsely triggered during mixed evacuations, before the mixed-evacuation candidates have been
// evacuated. Before acting on a false trigger, we check to confirm the trigger condition is still satisfied.
const size_t current_usage = _old_generation->used() + _old_generation->get_humongous_waste();
// _old_generation->used() includes humongous waste.
const size_t current_usage = _old_generation->used();
const size_t trigger_threshold = _old_generation->usage_trigger_threshold();
const size_t heap_size = heap->capacity();
const size_t ignore_threshold = (ShenandoahIgnoreOldGrowthBelowPercentage * heap_size) / 100;
Expand Down
7 changes: 5 additions & 2 deletions src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1164,6 +1164,9 @@ void ShenandoahConcurrentGC::op_update_thread_roots() {

void ShenandoahConcurrentGC::op_final_update_refs() {
ShenandoahHeap* const heap = ShenandoahHeap::heap();
bool is_generational = heap->mode()->is_generational();
ShenandoahGenerationalHeap* const gen_heap = is_generational? ShenandoahGenerationalHeap::heap(): nullptr;

assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at safepoint");
assert(!heap->_update_refs_iterator.has_next(), "Should have finished update references");

Expand All @@ -1187,7 +1190,7 @@ void ShenandoahConcurrentGC::op_final_update_refs() {
heap->set_update_refs_in_progress(false);
heap->set_has_forwarded_objects(false);

if (heap->mode()->is_generational() && heap->is_concurrent_old_mark_in_progress()) {
if (is_generational && heap->is_concurrent_old_mark_in_progress()) {
// When the SATB barrier is left on to support concurrent old gen mark, it may pick up writes to
// objects in the collection set. After those objects are evacuated, the pointers in the
// SATB are no longer safe. Once we have finished update references, we are guaranteed that
Expand All @@ -1206,7 +1209,7 @@ void ShenandoahConcurrentGC::op_final_update_refs() {

// Aging_cycle is only relevant during evacuation cycle for individual objects and during final mark for
// entire regions. Both of these relevant operations occur before final update refs.
ShenandoahGenerationalHeap::heap()->set_aging_cycle(false);
gen_heap->set_aging_cycle(false);
}

if (ShenandoahVerify) {
Expand Down
Loading