Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
0372026
Card table as DCQ
tschatzl Feb 11, 2025
7782295
* remove some commented out debug code
tschatzl Feb 24, 2025
9e26abb
* remove mention of "enqueue" or "enqueuing" for actions related to p…
tschatzl Feb 24, 2025
3004a96
* fix crash when writing dirty cards for memory regions during card t…
tschatzl Feb 24, 2025
b8100b9
* mdoerr review: fix comments in ppc code
tschatzl Feb 24, 2025
0100d8e
* only provide byte map base for JavaThreads
tschatzl Feb 25, 2025
9ef9c5f
* remove unnecessarily added logging
tschatzl Feb 25, 2025
e51eec8
* ayang review 1
tschatzl Feb 28, 2025
7d361fc
* ayang review 1 (ctd)
tschatzl Feb 28, 2025
d87935a
* fix assert
tschatzl Feb 28, 2025
810bf2d
* fix comment (trailing whitespace)
tschatzl Mar 3, 2025
b3dd008
ayang review 2
tschatzl Mar 3, 2025
8f46dc9
* iwalulya initial comments
tschatzl Mar 4, 2025
9e2ee54
* do not change card table base for gc threads during swapping
tschatzl Mar 4, 2025
442d9ea
* iwalulya review 2
tschatzl Mar 4, 2025
fc674f0
* ayang review - fix comment
tschatzl Mar 4, 2025
b4d19d9
iwalulya review
tschatzl Mar 4, 2025
4a97811
ayang review
tschatzl Mar 4, 2025
a457e6e
* fix whitespace
tschatzl Mar 5, 2025
350a4fa
* iwalulya review
tschatzl Mar 6, 2025
c994000
* ayang review 3
tschatzl Mar 7, 2025
93b884f
* fix card table verification crashes: in the first refinement phase,…
tschatzl Mar 8, 2025
758fac0
* optimized RISCV gen_write_ref_array_post_barrier() implementation c…
tschatzl Mar 11, 2025
aec9505
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Mar 12, 2025
3766b76
* ayang review
tschatzl Mar 12, 2025
7861117
* when aborting refinement during full collection, the global card ta…
tschatzl Mar 13, 2025
51a9eed
* ayang review
tschatzl Mar 14, 2025
b073017
Merge branch 'master' into 8342381-card-table-instead-of-dcq
tschatzl Mar 14, 2025
447fe39
* more documentation on why we need to rendezvous the gc threads
tschatzl Mar 15, 2025
4d0afd5
* obsolete G1UpdateBufferSize
tschatzl Mar 17, 2025
ff9eb26
Merge branch 'master' into 8342382-card-table-instead-of-dcq3
tschatzl Mar 18, 2025
c833bc8
* factor out card table and refinement table merging into a single
tschatzl Mar 18, 2025
f419556
* fix IR code generation tests that change due to barrier cost changes
tschatzl Mar 19, 2025
5e76a51
* make young gen length revising independent of refinement thread
tschatzl Mar 20, 2025
d931104
Merge branch 'master' into submit/8342382-card-table-instead-of-dcq
tschatzl Mar 21, 2025
6d574da
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Mar 26, 2025
51fb6e6
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Apr 1, 2025
27b3dd6
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Apr 4, 2025
1c5a669
* missing file from merge
tschatzl Apr 4, 2025
c5d5f3a
Reorder includes
robcasloz Apr 9, 2025
9481821
Refine needs_liveness_data
robcasloz Apr 9, 2025
855ec8d
Do not unnecessarily pass around tmp2 in x86
robcasloz Apr 9, 2025
d4649ed
* ayang review: revising young gen length
tschatzl Apr 9, 2025
63b1de8
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Apr 10, 2025
39aa903
* fixes after merge related to 32 bit x86 removal
tschatzl Apr 10, 2025
fcf96a2
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Apr 10, 2025
fd77531
* remove support for 32 bit x86 in the barrier generation code, follo…
tschatzl Apr 10, 2025
068d2a3
* indentation fix
tschatzl Apr 10, 2025
e683152
* ayang review (part 1)
tschatzl Apr 11, 2025
a3b2386
* ayang review (part 2 - yield duration changes)
tschatzl Apr 11, 2025
e4bf1ac
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Apr 23, 2025
51dfbe5
Merge branch 'master' into card-table-as-dcq-merge
tschatzl Apr 29, 2025
8b56880
* ayang review: remove sweep_epoch
tschatzl Apr 29, 2025
1def83a
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl May 15, 2025
c07a73d
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Jun 10, 2025
750ed2d
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Jun 27, 2025
441c234
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Jul 7, 2025
5ab928e
Merge branch 'master' into pull/23739
tschatzl Jul 14, 2025
4b21868
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Jul 17, 2025
cea0e1b
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Jul 23, 2025
dd83638
* remove unused G1DetachedRefinementStats_lock
tschatzl Jul 23, 2025
23aa2c8
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Jul 28, 2025
188fc81
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Aug 5, 2025
7fe518e
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Aug 12, 2025
6c88f1d
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Aug 22, 2025
e8a8282
* forgot to actually save the files
tschatzl Aug 22, 2025
cc4b7a0
* fix merge error
tschatzl Aug 22, 2025
4a41b40
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Sep 1, 2025
b3873d6
* commit merge changes
tschatzl Sep 1, 2025
104d506
* improve logging for refinement, making it similar to marking logging
tschatzl Sep 3, 2025
2a614a2
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Sep 4, 2025
4601bf8
* sort includes
tschatzl Sep 8, 2025
87b4136
* iwalulya: remove confusing comment
tschatzl Sep 10, 2025
e7c3a06
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Sep 10, 2025
de1469d
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Sep 10, 2025
d0ca906
* aph review, fix some comment
tschatzl Sep 10, 2025
b47c7b0
* walulyai review
tschatzl Sep 10, 2025
c469c13
* walulyai review
tschatzl Sep 10, 2025
74e9240
* therealaph suggestion for avoiding the register aliasin in gen_writ…
tschatzl Sep 12, 2025
1ced9f9
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Sep 12, 2025
bf8cab3
* iwalulya review
tschatzl Sep 12, 2025
b5d22d5
Merge branch 'master' into 8342382-card-table-instead-of-dcq
tschatzl Sep 22, 2025
53ef008
* improved gen_write_ref_array_post_barrier() for riscv, contributed …
tschatzl Sep 22, 2025
6e37f8d
* iwalulya: "Amount of" -> "Number of" in new flag description
tschatzl Sep 22, 2025
311bb3e
* walulyai: remove cost_per_pending_card_ms_default array since we on…
tschatzl Sep 22, 2025
d80d690
* walulyai: remove unnecessarily introduced newline
tschatzl Sep 22, 2025
3c889e9
* walulyai: bufferNodeList can be removed
tschatzl Sep 22, 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
3 changes: 0 additions & 3 deletions src/hotspot/share/gc/g1/g1CollectedHeap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1165,7 +1165,6 @@ G1CollectedHeap::G1CollectedHeap() :
_workers(nullptr),
_refinement_epoch(0),
_last_synchronized_start(0),
_safepoint_duration(0),
_last_refinement_epoch_start(0),
_yield_duration_in_refinement_epoch(0),
_last_safepoint_refinement_epoch(0),
Expand Down Expand Up @@ -1534,8 +1533,6 @@ void G1CollectedHeap::safepoint_synchronize_end() {
jlong now = os::elapsed_counter();
jlong synchronize_duration = now - _last_synchronized_start;

_safepoint_duration += synchronize_duration;

if (_last_safepoint_refinement_epoch == refinement_epoch()) {
_yield_duration_in_refinement_epoch += synchronize_duration;
} else {
Expand Down
2 changes: 0 additions & 2 deletions src/hotspot/share/gc/g1/g1CollectedHeap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,6 @@ class G1CollectedHeap : public CollectedHeap {
// The following members are for tracking safepoint durations between garbage
// collections.
jlong _last_synchronized_start;
jlong _safepoint_duration; // Time spent in safepoints since start of VM.

jlong _last_refinement_epoch_start;
jlong _yield_duration_in_refinement_epoch; // Time spent in safepoints since beginning of last refinement epoch.
Expand Down Expand Up @@ -915,7 +914,6 @@ class G1CollectedHeap : public CollectedHeap {
void safepoint_synchronize_begin() override;
void safepoint_synchronize_end() override;

jlong safepoint_duration() const { return _safepoint_duration; }
jlong last_refinement_epoch_start() const { return _last_refinement_epoch_start; }
void set_last_refinement_epoch_start(jlong epoch_start, jlong last_yield_duration);
jlong yield_duration_in_refinement_epoch();
Expand Down
18 changes: 7 additions & 11 deletions src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,20 +147,16 @@ void G1ConcurrentRefineSweepState::reset_stats() {
stats()->reset();
}

void G1ConcurrentRefineSweepState::add_yield_duration(jlong duration) {
stats()->inc_yield_duration(duration);
void G1ConcurrentRefineSweepState::add_yield_during_sweep_duration(jlong duration) {
stats()->inc_yield_during_sweep_duration(duration);
}

size_t G1ConcurrentRefineSweepState::refinement_epoch() {
return G1CollectedHeap::heap()->refinement_epoch();
}

bool G1ConcurrentRefineSweepState::in_sweep_epoch() const {
return _sweep_start_epoch == refinement_epoch();
}

bool G1ConcurrentRefineSweepState::advance_state(State next_state) {
bool result = in_sweep_epoch();
bool result = _sweep_start_epoch == refinement_epoch();
if (result) {
_state = next_state;
} else {
Expand Down Expand Up @@ -200,7 +196,7 @@ bool G1ConcurrentRefineSweepState::swap_global_card_table() {
MutexLocker mu(Threads_lock);
// A GC that advanced the epoch might have happened, which already switched
// The global card table. Do nothing.
if (in_sweep_epoch()) {
if (is_in_progress()) {
G1BarrierSet::g1_barrier_set()->swap_global_card_table();
}
}
Expand Down Expand Up @@ -327,7 +323,7 @@ bool G1ConcurrentRefineSweepState::complete_work(bool concurrent, bool print_log

log_debug(gc, refine)("Refinement took %.2fms (pre-sweep %.2fms card refine %.2f) "
"(scanned %zu clean %zu (%.2f%%) not_clean %zu (%.2f%%) not_parsable %zu "
"refers_to_cset %zu (%.2f%%) still_refers_to_cset %zu (%.2f%%) clean_again %zu pending %zu)",
"refers_to_cset %zu (%.2f%%) still_refers_to_cset %zu (%.2f%%) no_cross_region %zu pending %zu)",
get_duration(State::Idle, _state).seconds() * 1000.0,
get_duration(State::Idle, State::SweepRT).seconds() * 1000.0,
TimeHelper::counter_to_millis(s->refine_duration()),
Expand All @@ -341,12 +337,12 @@ bool G1ConcurrentRefineSweepState::complete_work(bool concurrent, bool print_log
percent_of(s->cards_refer_to_cset(), s->cards_not_clean()),
s->cards_already_refer_to_cset(),
percent_of(s->cards_already_refer_to_cset(), s->cards_not_clean()),
s->cards_clean_again(),
s->cards_no_cross_region(),
s->cards_pending()
);
}

bool has_sweep_rt_work = is_in_progress() && _state == State::SweepRT;
bool has_sweep_rt_work = _state == State::SweepRT;

_state = State::Idle;
return has_sweep_rt_work;
Expand Down
4 changes: 1 addition & 3 deletions src/hotspot/share/gc/g1/g1ConcurrentRefine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,6 @@ class G1ConcurrentRefineSweepState {

static size_t refinement_epoch();

bool in_sweep_epoch() const;

// Advances the state to next_state if not interrupted by a changed epoch. Returns
// to Idle otherwise.
bool advance_state(State next_state);
Expand Down Expand Up @@ -180,7 +178,7 @@ class G1ConcurrentRefineSweepState {
G1ConcurrentRefineStats* stats() { return &_stats; }
void reset_stats();

void add_yield_duration(jlong duration);
void add_yield_during_sweep_duration(jlong duration);

bool is_in_progress() const;
bool are_java_threads_synched() const;
Expand Down
8 changes: 4 additions & 4 deletions src/hotspot/share/gc/g1/g1ConcurrentRefineStats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,26 @@

G1ConcurrentRefineStats::G1ConcurrentRefineStats() :
_sweep_duration(0),
_yield_duration(0),
_yield_during_sweep_duration(0),
_cards_scanned(0),
_cards_clean(0),
_cards_not_parsable(0),
_cards_already_refer_to_cset(0),
_cards_refer_to_cset(0),
_cards_clean_again(0),
_cards_no_cross_region(0),
_refine_duration(0)
{}

void G1ConcurrentRefineStats::add_atomic(G1ConcurrentRefineStats* other) {
Atomic::add(&_sweep_duration, other->_sweep_duration, memory_order_relaxed);
Atomic::add(&_yield_duration, other->_yield_duration, memory_order_relaxed);
Atomic::add(&_yield_during_sweep_duration, other->_yield_during_sweep_duration, memory_order_relaxed);

Atomic::add(&_cards_scanned, other->_cards_scanned, memory_order_relaxed);
Atomic::add(&_cards_clean, other->_cards_clean, memory_order_relaxed);
Atomic::add(&_cards_not_parsable, other->_cards_not_parsable, memory_order_relaxed);
Atomic::add(&_cards_already_refer_to_cset, other->_cards_already_refer_to_cset, memory_order_relaxed);
Atomic::add(&_cards_refer_to_cset, other->_cards_refer_to_cset, memory_order_relaxed);
Atomic::add(&_cards_clean_again, other->_cards_clean_again, memory_order_relaxed);
Atomic::add(&_cards_no_cross_region, other->_cards_no_cross_region, memory_order_relaxed);

Atomic::add(&_refine_duration, other->_refine_duration, memory_order_relaxed);
}
Expand Down
14 changes: 7 additions & 7 deletions src/hotspot/share/gc/g1/g1ConcurrentRefineStats.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@
class G1ConcurrentRefineStats : public CHeapObj<mtGC> {
jlong _sweep_duration; // Time spent sweeping the table finding non-clean cards
// and refining them.
jlong _yield_duration; // Time spent yielding during the sweep (not doing the sweep).
jlong _yield_during_sweep_duration; // Time spent yielding during the sweep (not doing the sweep).

size_t _cards_scanned; // Total number of cards scanned.
size_t _cards_clean; // Number of cards found clean.
size_t _cards_not_parsable; // Number of cards we could not parse and left unrefined.
size_t _cards_already_refer_to_cset;// Number of cards marked found to be already young.
size_t _cards_refer_to_cset; // Number of dirty cards that were recently found to contain a to-cset reference.
size_t _cards_clean_again; // Number of dirty cards that were cleaned by the mutator.
size_t _cards_no_cross_region; // Number of dirty cards that were dirtied, but then cleaned again by the mutator.

jlong _refine_duration; // Time spent during actual refinement.

Expand All @@ -51,8 +51,8 @@ class G1ConcurrentRefineStats : public CHeapObj<mtGC> {

// Time spent performing sweeping the refinement table (includes actual refinement,
// but not yield time).
jlong sweep_duration() const { return _sweep_duration - _yield_duration; }
jlong yield_duration() const { return _yield_duration; }
jlong sweep_duration() const { return _sweep_duration - _yield_during_sweep_duration; }
jlong yield_during_sweep_duration() const { return _yield_during_sweep_duration; }
jlong refine_duration() const { return _refine_duration; }

// Number of refined cards.
Expand All @@ -64,23 +64,23 @@ class G1ConcurrentRefineStats : public CHeapObj<mtGC> {
size_t cards_not_parsable() const { return _cards_not_parsable; }
size_t cards_already_refer_to_cset() const { return _cards_already_refer_to_cset; }
size_t cards_refer_to_cset() const { return _cards_refer_to_cset; }
size_t cards_clean_again() const { return _cards_clean_again; }
size_t cards_no_cross_region() const { return _cards_no_cross_region; }
// Number of cards that were marked dirty and in need of refinement. This includes cards recently
// found to refer to the collection set as they originally were dirty.
size_t cards_pending() const { return cards_not_clean() - _cards_already_refer_to_cset; }

size_t cards_to_cset() const { return _cards_already_refer_to_cset + _cards_refer_to_cset; }

void inc_sweep_time(jlong t) { _sweep_duration += t; }
void inc_yield_duration(jlong t) { _yield_duration += t; }
void inc_yield_during_sweep_duration(jlong t) { _yield_during_sweep_duration += t; }
void inc_refine_duration(jlong t) { _refine_duration += t; }

void inc_cards_scanned(size_t increment) { _cards_scanned += increment; }
void inc_cards_clean(size_t increment) { _cards_clean += increment; }
void inc_cards_not_parsable() { _cards_not_parsable++; }
void inc_cards_already_refer_to_cset() { _cards_already_refer_to_cset++; }
void inc_cards_refer_to_cset() { _cards_refer_to_cset++; }
void inc_cards_clean_again() { _cards_clean_again++; }
void inc_cards_no_cross_region() { _cards_no_cross_region++; }

void add_atomic(G1ConcurrentRefineStats* other);

Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/share/gc/g1/g1ConcurrentRefineSweepTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ class G1RefineRegionClosure : public G1HeapRegionClosure {
_refine_stats.inc_cards_already_refer_to_cset();
break;
}
case G1RemSet::NoInteresting: {
_refine_stats.inc_cards_clean_again();
case G1RemSet::NoCrossRegion: {
_refine_stats.inc_cards_no_cross_region();
break;
}
case G1RemSet::CouldNotParse: {
Expand Down
11 changes: 6 additions & 5 deletions src/hotspot/share/gc/g1/g1ConcurrentRefineThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ void G1ConcurrentRefineThread::do_refinement() {
jlong epoch_yield_duration = g1h->yield_duration_in_refinement_epoch();
jlong next_epoch_start = os::elapsed_counter();

jlong synchronize_duration_at_sweep_start = g1h->safepoint_duration();
jlong total_yield_during_sweep_duration = 0;

// 4. Snapshot heap.
state.snapshot_heap();
Expand All @@ -187,7 +187,7 @@ void G1ConcurrentRefineThread::do_refinement() {
}

if (SuspendibleThreadSet::should_yield()) {
jlong yield_start = os::elapsed_counter();
jlong yield_during_sweep_start = os::elapsed_counter();
SuspendibleThreadSet::yield();

// The yielding may have completed the task, check.
Expand All @@ -196,15 +196,16 @@ void G1ConcurrentRefineThread::do_refinement() {
interrupted_by_gc = true;
break;
} else {
jlong yield_duration = os::elapsed_counter() - yield_start;
jlong yield_during_sweep_duration = os::elapsed_counter() - yield_during_sweep_start;
log_debug(gc, refine)("Yielded from card table sweeping for %.2fms, no GC inbetween, continue",
TimeHelper::counter_to_millis(yield_duration));
TimeHelper::counter_to_millis(yield_during_sweep_duration));
total_yield_during_sweep_duration += yield_during_sweep_duration;
}
}
}

if (!interrupted_by_gc) {
state.add_yield_duration(G1CollectedHeap::heap()->safepoint_duration() - synchronize_duration_at_sweep_start);
state.add_yield_during_sweep_duration(total_yield_during_sweep_duration);

state.complete_work(true);

Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/g1/g1Policy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,7 @@ static void log_refinement_stats(const G1ConcurrentRefineStats& stats) {
log_debug(gc, refine, stats)
("Refinement: sweep: %.2fms, yield: %.2fms refined: %zu, dirtied: %zu",
TimeHelper::counter_to_millis(stats.sweep_duration()),
TimeHelper::counter_to_millis(stats.yield_duration()),
TimeHelper::counter_to_millis(stats.yield_during_sweep_duration()),
stats.refined_cards(),
stats.cards_pending());
}
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/g1/g1RemSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1363,7 +1363,7 @@ G1RemSet::RefineResult G1RemSet::refine_card_concurrently(CardValue* const card_
} else if (conc_refine_cl.has_ref_to_old()) {
return HasRefToOld;
} else {
return NoInteresting;
return NoCrossRegion;
}
}
// If unable to process the card then we encountered an unparsable
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/g1/g1RemSet.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ class G1RemSet: public CHeapObj<mtGC> {
HasRefToCSet, // The (dirty) card has a reference to the collection set.
AlreadyToCSet, // The card is already one marked as having a reference to the collection set.
HasRefToOld, // The dirty card contains references to other old regions (not the collection set).
NoInteresting, // There is no interesting reference in the card any more. The mutator changed all
NoCrossRegion, // There is no interesting reference in the card any more. The mutator changed all
// references to such after dirtying the card.
CouldNotParse // The card is unparsable, need to retry later.
};
Expand Down