Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 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
666b566
fix problem with traditional shenandoah bytes_allocated_since_gc
kdnilsen Aug 22, 2025
1c519b3
debug instrumentation and remove unused get_total_region_count()
kdnilsen Aug 26, 2025
528cab0
attempt to improve performance
kdnilsen Aug 27, 2025
f620dd2
Fix errors introduced by performance optimizations
kdnilsen Aug 28, 2025
fa71642
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Aug 28, 2025
a433653
Add disabled instrumentation to debug performance problems
kdnilsen Sep 1, 2025
25a9c39
do not reset bytes allocated since gc each time we rebuild free set
kdnilsen Sep 1, 2025
0771210
Do not reset bytes allocated since gc start at start of concurrent ol…
kdnilsen Sep 2, 2025
022011e
Initialize _mutator_bytes_allocated_since_gc-start
kdnilsen Sep 2, 2025
aa92dbe
Fix accounting for pip regions
kdnilsen Sep 2, 2025
65760d3
more fixes to pip accounting
kdnilsen Sep 2, 2025
3a66540
fix white space
kdnilsen Sep 2, 2025
c20a51f
Zero [empty_]region_counts in make_all_regions_unavailable plus lots …
kdnilsen Sep 8, 2025
40653c1
Replace MEMORY_USAGE debugging with assertions
kdnilsen Sep 8, 2025
b98dc00
Remove RENAISSANCE debugging instrumentation
kdnilsen Sep 8, 2025
bcdeab0
Cleanup make_all_regions_unavailable()
kdnilsen Sep 8, 2025
6c6aba8
Remove debug instrumentation
kdnilsen Sep 8, 2025
87e26b3
Fix ShenandoahAllocationRate::sample() and remove debug scaffolding
kdnilsen Sep 9, 2025
a77eb75
Add include file for missing declaration
kdnilsen Sep 9, 2025
cd9522a
another tweak to make GHA gtest happy
kdnilsen Sep 9, 2025
46717a7
revert changes to shenandoahAdaptiveHeuristics.cpp
kdnilsen Sep 28, 2025
7fad848
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Sep 28, 2025
ad45b66
Change spelling of symbolic constant in test program
kdnilsen Sep 29, 2025
7bd40d9
Use OO implementation of ShenandoahGeneration::used()
kdnilsen Sep 29, 2025
144ace0
Fix typo introduced during merge
kdnilsen Sep 29, 2025
01229f4
more cosmetic improvements for used
kdnilsen Sep 29, 2025
8a0cee0
cosmetic miprovements for bytes_allocated_since_gc_start() and get_af…
kdnilsen Sep 29, 2025
cbe8340
OO improvements to get_humongous_waste()
kdnilsen Sep 30, 2025
c6a51a9
OO refinements to used_regions
kdnilsen Sep 30, 2025
aa3f379
OO refinements to max_capacity()
kdnilsen Sep 30, 2025
7365e70
OO refinements to free_unaffiliated_regions()
kdnilsen Sep 30, 2025
ce042ad
fix broken assert from previous commit
kdnilsen Sep 30, 2025
40820f8
OO refinements to used_regions_size()
kdnilsen Sep 30, 2025
43e1358
small refactoring
kdnilsen Sep 30, 2025
f4dadd4
revert introduction of index_type
kdnilsen Oct 3, 2025
f6a1182
simplify implementation of promote_in_place
kdnilsen Oct 3, 2025
5277bc1
remove set_capacity() scaffolding from shenandoahOldGeneration.hpp
kdnilsen Oct 7, 2025
12ee23b
simplify assertions
kdnilsen Oct 7, 2025
510a4b8
Make ShenandoahGeneration methods pure virtual
kdnilsen Oct 7, 2025
bd8e7f7
revert gratuitous changes to shenandoahConcurrentGC.cpp
kdnilsen Oct 7, 2025
79f83c3
remove stale comment
kdnilsen Oct 7, 2025
6c90bbf
Remove ShenandoahGenerationSizer
kdnilsen Oct 7, 2025
3ed6656
finish excising shenandoahGenerationSizer
kdnilsen Oct 7, 2025
26a516c
Remove unnecessary methods
kdnilsen Oct 7, 2025
abfc96d
remove meaningless assert
kdnilsen Oct 7, 2025
d342f83
fix indentation
kdnilsen Oct 7, 2025
5ed2392
remove unneeded variables from ShenandoahGeneration
kdnilsen Oct 7, 2025
4db0cbe
add override to method declaration
kdnilsen Oct 7, 2025
6c48bf1
fix test
kdnilsen Oct 8, 2025
6ec5021
fix override declaration
kdnilsen Oct 8, 2025
4c3c38b
fix anothr override declaration
kdnilsen Oct 8, 2025
9c2dc8b
revert change to SoftMaxHeapSizeConstraintFunc
kdnilsen Oct 9, 2025
9b36ee3
clamp SoftMaxHeapSize during initialization
kdnilsen Oct 9, 2025
891e96b
After initialization, check for SoftMaxHeapSize changed by constraint…
kdnilsen Oct 18, 2025
ee617c3
Fix up vmstructs and other infrastructure for jmap heap dump
kdnilsen Oct 21, 2025
da92c34
Add sleep to CompressedClassSpaceSizeInJmapHeap.java test
kdnilsen Oct 22, 2025
b107bc5
Add debug instrumentation to CompressedClassSpaceSizeInJmapHeap.java
kdnilsen Oct 23, 2025
3b56759
fix errors in CompressedClassSpaceSizeInJmapHeap.java
kdnilsen Oct 23, 2025
467e751
Rework implementation of CompressedClassSpaceSizeInJmapHeap.java
kdnilsen Oct 24, 2025
abf9b1f
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Oct 24, 2025
5557ae9
reviewer feedback
kdnilsen Oct 25, 2025
657529e
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Oct 30, 2025
53af6b1
Merge remote-tracking branch 'jdk/master' into freeset-has-authoritat…
kdnilsen Oct 31, 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
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,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 @@ -133,9 +134,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 @@ -606,12 +606,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 @@ -683,7 +683,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
1,813 changes: 1,515 additions & 298 deletions src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp

Large diffs are not rendered by default.

449 changes: 380 additions & 69 deletions src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp

Large diffs are not rendered by default.

40 changes: 2 additions & 38 deletions src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,6 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) {
worker_slices[i] = new ShenandoahHeapRegionSet();
}

ShenandoahGenerationalHeap::TransferResult result;
{
// The rest of code performs region moves, where region status is undefined
// until all phases run together.
Expand All @@ -251,14 +250,7 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) {

phase4_compact_objects(worker_slices);

result = phase5_epilog();
}
if (heap->mode()->is_generational()) {
LogTarget(Info, gc, ergo) lt;
if (lt.is_enabled()) {
LogStream ls(lt);
result.print_on("Full GC", &ls);
}
phase5_epilog();
}

// Resize metaspace
Expand Down Expand Up @@ -984,23 +976,6 @@ class ShenandoahPostCompactClosure : public ShenandoahHeapRegionClosure {
r->set_live_data(live);
r->reset_alloc_metadata();
}

void update_generation_usage() {
if (_is_generational) {
_heap->old_generation()->establish_usage(_old_regions, _old_usage, _old_humongous_waste);
_heap->young_generation()->establish_usage(_young_regions, _young_usage, _young_humongous_waste);
} else {
assert(_old_regions == 0, "Old regions only expected in generational mode");
assert(_old_usage == 0, "Old usage only expected in generational mode");
assert(_old_humongous_waste == 0, "Old humongous waste only expected in generational mode");
}

// In generational mode, global usage should be the sum of young and old. This is also true
// for non-generational modes except that there are no old regions.
_heap->global_generation()->establish_usage(_old_regions + _young_regions,
_old_usage + _young_usage,
_old_humongous_waste + _young_humongous_waste);
}
};

void ShenandoahFullGC::compact_humongous_objects() {
Expand Down Expand Up @@ -1120,10 +1095,9 @@ void ShenandoahFullGC::phase4_compact_objects(ShenandoahHeapRegionSet** worker_s
}
}

ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() {
void ShenandoahFullGC::phase5_epilog() {
GCTraceTime(Info, gc, phases) time("Phase 5: Full GC epilog", _gc_timer);
ShenandoahHeap* heap = ShenandoahHeap::heap();
ShenandoahGenerationalHeap::TransferResult result;

// Reset complete bitmap. We're about to reset the complete-top-at-mark-start pointer
// and must ensure the bitmap is in sync.
Expand All @@ -1138,12 +1112,6 @@ ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() {
ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_copy_objects_rebuild);
ShenandoahPostCompactClosure post_compact;
heap->heap_region_iterate(&post_compact);
post_compact.update_generation_usage();

if (heap->mode()->is_generational()) {
ShenandoahGenerationalFullGC::balance_generations_after_gc(heap);
}

heap->collection_set()->clear();
size_t young_cset_regions, old_cset_regions;
size_t first_old, last_old, num_old;
Expand All @@ -1166,11 +1134,7 @@ ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() {
_preserved_marks->restore(heap->workers());
_preserved_marks->reclaim();

// We defer generation resizing actions until after cset regions have been recycled. We do this even following an
// abbreviated cycle.
if (heap->mode()->is_generational()) {
result = ShenandoahGenerationalFullGC::balance_generations_after_rebuilding_free_set();
ShenandoahGenerationalFullGC::rebuild_remembered_set(heap);
}
return result;
}
3 changes: 1 addition & 2 deletions src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,7 @@ class ShenandoahFullGC : public ShenandoahGC {
void phase2_calculate_target_addresses(ShenandoahHeapRegionSet** worker_slices);
void phase3_update_references();
void phase4_compact_objects(ShenandoahHeapRegionSet** worker_slices);
ShenandoahGenerationalHeap::TransferResult phase5_epilog();

void phase5_epilog();
void distribute_slices(ShenandoahHeapRegionSet** worker_slices);
void calculate_target_humongous_objects();
void compact_humongous_objects();
Expand Down
Loading