8244180: Shenandoah: carry Phase to ShWorkerTimingsTracker explicitly

Reviewed-by: zgu
This commit is contained in:
Aleksey Shipilev 2020-04-30 18:05:53 +02:00
parent 1e1c724c0d
commit 38e6f3665c
13 changed files with 177 additions and 116 deletions

View File

@ -346,7 +346,7 @@ private:
public:
ShenandoahUpdateThreadRootsTask(bool is_par, ShenandoahPhaseTimings::Phase phase) :
AbstractGangTask("Shenandoah Update Thread Roots"),
_thread_roots(is_par),
_thread_roots(phase, is_par),
_phase(phase),
_worker_phase(phase) {}

View File

@ -1645,9 +1645,10 @@ private:
ShenandoahConcurrentStringDedupRoots _dedup_roots;
public:
ShenandoahConcurrentRootsEvacUpdateTask() :
AbstractGangTask("Shenandoah Evacuate/Update Concurrent Strong Roots Task") {
}
ShenandoahConcurrentRootsEvacUpdateTask(ShenandoahPhaseTimings::Phase phase) :
AbstractGangTask("Shenandoah Evacuate/Update Concurrent Strong Roots Task"),
_vm_roots(phase),
_cld_roots(phase) {}
void work(uint worker_id) {
ShenandoahEvacOOMScope oom;
@ -1761,12 +1762,13 @@ private:
bool _concurrent_class_unloading;
public:
ShenandoahConcurrentWeakRootsEvacUpdateTask() :
ShenandoahConcurrentWeakRootsEvacUpdateTask(ShenandoahPhaseTimings::Phase phase) :
AbstractGangTask("Shenandoah Concurrent Weak Root Task"),
_jni_roots(OopStorageSet::jni_weak(), ShenandoahPhaseTimings::JNIWeakRoots),
_string_table_roots(OopStorageSet::string_table_weak(), ShenandoahPhaseTimings::StringTableRoots),
_resolved_method_table_roots(OopStorageSet::resolved_method_table_weak(), ShenandoahPhaseTimings::ResolvedMethodTableRoots),
_vm_roots(OopStorageSet::vm_weak(), ShenandoahPhaseTimings::VMWeakRoots),
_jni_roots(OopStorageSet::jni_weak(), phase, ShenandoahPhaseTimings::JNIWeakRoots),
_string_table_roots(OopStorageSet::string_table_weak(), phase, ShenandoahPhaseTimings::StringTableRoots),
_resolved_method_table_roots(OopStorageSet::resolved_method_table_weak(), phase, ShenandoahPhaseTimings::ResolvedMethodTableRoots),
_vm_roots(OopStorageSet::vm_weak(), phase, ShenandoahPhaseTimings::VMWeakRoots),
_cld_roots(phase),
_nmethod_itr(ShenandoahCodeRoots::table()),
_concurrent_class_unloading(ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) {
StringTable::reset_dead_counter();
@ -1826,7 +1828,7 @@ public:
void ShenandoahHeap::op_weak_roots() {
if (is_concurrent_weak_root_in_progress()) {
// Concurrent weak root processing
ShenandoahConcurrentWeakRootsEvacUpdateTask task;
ShenandoahConcurrentWeakRootsEvacUpdateTask task(ShenandoahPhaseTimings::conc_weak_roots);
workers()->run_task(&task);
if (!ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) {
set_concurrent_weak_root_in_progress(false);
@ -1844,7 +1846,7 @@ void ShenandoahHeap::op_class_unloading() {
void ShenandoahHeap::op_strong_roots() {
assert(is_concurrent_strong_root_in_progress(), "Checked by caller");
ShenandoahConcurrentRootsEvacUpdateTask task;
ShenandoahConcurrentRootsEvacUpdateTask task(ShenandoahPhaseTimings::conc_strong_roots);
workers()->run_task(&task);
set_concurrent_strong_root_in_progress(false);
}
@ -2243,17 +2245,17 @@ void ShenandoahHeap::stw_process_weak_roots(bool full_gc) {
ShenandoahForwardedIsAliveClosure is_alive;
ShenandoahUpdateRefsClosure keep_alive;
ShenandoahParallelWeakRootsCleaningTask<ShenandoahForwardedIsAliveClosure, ShenandoahUpdateRefsClosure>
cleaning_task(&is_alive, &keep_alive, num_workers, !ShenandoahConcurrentRoots::should_do_concurrent_class_unloading());
cleaning_task(timing_phase, &is_alive, &keep_alive, num_workers, !ShenandoahConcurrentRoots::should_do_concurrent_class_unloading());
_workers->run_task(&cleaning_task);
} else {
ShenandoahIsAliveClosure is_alive;
#ifdef ASSERT
ShenandoahAssertNotForwardedClosure verify_cl;
ShenandoahParallelWeakRootsCleaningTask<ShenandoahIsAliveClosure, ShenandoahAssertNotForwardedClosure>
cleaning_task(&is_alive, &verify_cl, num_workers, !ShenandoahConcurrentRoots::should_do_concurrent_class_unloading());
cleaning_task(timing_phase, &is_alive, &verify_cl, num_workers, !ShenandoahConcurrentRoots::should_do_concurrent_class_unloading());
#else
ShenandoahParallelWeakRootsCleaningTask<ShenandoahIsAliveClosure, DoNothingClosure>
cleaning_task(&is_alive, &do_nothing_cl, num_workers, !ShenandoahConcurrentRoots::should_do_concurrent_class_unloading());
cleaning_task(timing_phase, &is_alive, &do_nothing_cl, num_workers, !ShenandoahConcurrentRoots::should_do_concurrent_class_unloading());
#endif
_workers->run_task(&cleaning_task);
}

View File

@ -36,6 +36,7 @@
template <typename IsAlive, typename KeepAlive>
class ShenandoahParallelWeakRootsCleaningTask : public AbstractGangTask {
protected:
ShenandoahPhaseTimings::Phase _phase;
WeakProcessor::Task _weak_processing_task;
ShenandoahSerialWeakRoots _serial_weak_roots;
IsAlive* _is_alive;
@ -43,7 +44,8 @@ protected:
bool _include_concurrent_roots;
public:
ShenandoahParallelWeakRootsCleaningTask(IsAlive* is_alive,
ShenandoahParallelWeakRootsCleaningTask(ShenandoahPhaseTimings::Phase phase,
IsAlive* is_alive,
KeepAlive* keep_alive,
uint num_workers,
bool include_concurrent_roots);

View File

@ -33,12 +33,13 @@
#include "runtime/safepoint.hpp"
template<typename IsAlive, typename KeepAlive>
ShenandoahParallelWeakRootsCleaningTask<IsAlive, KeepAlive>::ShenandoahParallelWeakRootsCleaningTask(IsAlive* is_alive,
ShenandoahParallelWeakRootsCleaningTask<IsAlive, KeepAlive>::ShenandoahParallelWeakRootsCleaningTask(ShenandoahPhaseTimings::Phase phase,
IsAlive* is_alive,
KeepAlive* keep_alive,
uint num_workers,
bool include_concurrent_roots) :
AbstractGangTask("Parallel Weak Root Cleaning Task"),
_weak_processing_task(num_workers),
_phase(phase), _weak_processing_task(num_workers), _serial_weak_roots(phase),
_is_alive(is_alive), _keep_alive(keep_alive), _include_concurrent_roots(include_concurrent_roots) {
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
@ -63,7 +64,7 @@ void ShenandoahParallelWeakRootsCleaningTask<IsAlive, KeepAlive>::work(uint work
}
if (ShenandoahStringDedup::is_enabled()) {
ShenandoahStringDedup::parallel_oops_do(_is_alive, _keep_alive, worker_id);
ShenandoahStringDedup::parallel_oops_do(_phase, _is_alive, _keep_alive, worker_id);
}
}

View File

@ -75,8 +75,6 @@ ShenandoahPhaseTimings::ShenandoahPhaseTimings(uint max_workers) :
_policy = ShenandoahHeap::heap()->shenandoah_policy();
assert(_policy != NULL, "Can not be NULL");
_current_worker_phase = _invalid_phase;
}
ShenandoahPhaseTimings::Phase ShenandoahPhaseTimings::worker_par_phase(Phase phase, ParPhase par_phase) {
@ -115,6 +113,22 @@ bool ShenandoahPhaseTimings::is_worker_phase(Phase phase) {
}
}
bool ShenandoahPhaseTimings::is_root_work_phase(Phase phase) {
switch (phase) {
case scan_roots:
case update_roots:
case init_evac:
case final_update_refs_roots:
case degen_gc_update_roots:
case full_gc_scan_roots:
case full_gc_update_roots:
case full_gc_adjust_roots:
return true;
default:
return false;
}
}
void ShenandoahPhaseTimings::set_cycle_data(Phase phase, double time) {
#ifdef ASSERT
double d = _cycle_data[phase];
@ -132,10 +146,6 @@ void ShenandoahPhaseTimings::record_phase_time(Phase phase, double time) {
void ShenandoahPhaseTimings::record_workers_start(Phase phase) {
assert(is_worker_phase(phase), "Phase should accept worker phase times: %s", phase_name(phase));
assert(_current_worker_phase == _invalid_phase, "Should not be set yet: requested %s, existing %s",
phase_name(phase), phase_name(_current_worker_phase));
_current_worker_phase = phase;
for (uint i = 1; i < _num_par_phases; i++) {
worker_data(phase, ParPhase(i))->reset();
}
@ -143,7 +153,6 @@ void ShenandoahPhaseTimings::record_workers_start(Phase phase) {
void ShenandoahPhaseTimings::record_workers_end(Phase phase) {
assert(is_worker_phase(phase), "Phase should accept worker phase times: %s", phase_name(phase));
_current_worker_phase = _invalid_phase;
}
void ShenandoahPhaseTimings::flush_par_workers_to_cycle() {
@ -233,9 +242,11 @@ void ShenandoahPhaseTimings::print_global_on(outputStream* out) const {
}
}
ShenandoahWorkerTimingsTracker::ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::ParPhase par_phase, uint worker_id) :
_timings(ShenandoahHeap::heap()->phase_timings()), _phase(_timings->current_worker_phase()),
_par_phase(par_phase), _worker_id(worker_id) {
ShenandoahWorkerTimingsTracker::ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::Phase phase,
ShenandoahPhaseTimings::ParPhase par_phase, uint worker_id) :
_timings(ShenandoahHeap::heap()->phase_timings()),
_phase(phase), _par_phase(par_phase), _worker_id(worker_id) {
assert(_timings->worker_data(_phase, _par_phase)->get(_worker_id) == ShenandoahWorkerData::uninitialized(),
"Should not be set yet: %s", ShenandoahPhaseTimings::phase_name(_timings->worker_par_phase(_phase, _par_phase)));
_start_time = os::elapsedTime();
@ -244,8 +255,8 @@ ShenandoahWorkerTimingsTracker::ShenandoahWorkerTimingsTracker(ShenandoahPhaseTi
ShenandoahWorkerTimingsTracker::~ShenandoahWorkerTimingsTracker() {
_timings->worker_data(_phase, _par_phase)->set(_worker_id, os::elapsedTime() - _start_time);
if (ShenandoahGCPhase::is_root_work_phase()) {
ShenandoahPhaseTimings::Phase root_phase = ShenandoahGCPhase::current_phase();
if (ShenandoahPhaseTimings::is_root_work_phase(_phase)) {
ShenandoahPhaseTimings::Phase root_phase = _phase;
ShenandoahPhaseTimings::Phase cur_phase = _timings->worker_par_phase(root_phase, _par_phase);
_event.commit(GCId::current(), _worker_id, ShenandoahPhaseTimings::phase_name(cur_phase));
}

View File

@ -183,12 +183,11 @@ private:
HdrSeq _global_data[_num_phases];
static const char* _phase_names[_num_phases];
Phase _current_worker_phase;
ShenandoahWorkerData* _worker_data[_num_phases];
ShenandoahCollectorPolicy* _policy;
static bool is_worker_phase(Phase phase);
Phase current_worker_phase() { return _current_worker_phase; }
static bool is_root_work_phase(Phase phase);
ShenandoahWorkerData* worker_data(Phase phase, ParPhase par_phase);
Phase worker_par_phase(Phase phase, ParPhase par_phase);
@ -225,7 +224,7 @@ private:
double _start_time;
EventGCPhaseParallel _event;
public:
ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::ParPhase par_phase, uint worker_id);
ShenandoahWorkerTimingsTracker(ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase, uint worker_id);
~ShenandoahWorkerTimingsTracker();
};

View File

@ -42,13 +42,14 @@
#include "runtime/thread.hpp"
#include "services/management.hpp"
ShenandoahSerialRoot::ShenandoahSerialRoot(ShenandoahSerialRoot::OopsDo oops_do, ShenandoahPhaseTimings::ParPhase par_phase) :
_oops_do(oops_do), _par_phase(par_phase) {
ShenandoahSerialRoot::ShenandoahSerialRoot(ShenandoahSerialRoot::OopsDo oops_do,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase) :
_oops_do(oops_do), _phase(phase), _par_phase(par_phase) {
}
void ShenandoahSerialRoot::oops_do(OopClosure* cl, uint worker_id) {
if (_claimed.try_set()) {
ShenandoahWorkerTimingsTracker timer(_par_phase, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, _par_phase, worker_id);
_oops_do(cl);
}
}
@ -58,12 +59,12 @@ static void system_dictionary_oops_do(OopClosure* cl) {
SystemDictionary::oops_do(cl, false);
}
ShenandoahSerialRoots::ShenandoahSerialRoots() :
_universe_root(&Universe::oops_do, ShenandoahPhaseTimings::UniverseRoots),
_object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
_management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
_system_dictionary_root(&system_dictionary_oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
_jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots) {
ShenandoahSerialRoots::ShenandoahSerialRoots(ShenandoahPhaseTimings::Phase phase) :
_universe_root(&Universe::oops_do, phase, ShenandoahPhaseTimings::UniverseRoots),
_object_synchronizer_root(&ObjectSynchronizer::oops_do, phase, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
_management_root(&Management::oops_do, phase, ShenandoahPhaseTimings::ManagementRoots),
_system_dictionary_root(&system_dictionary_oops_do, phase, ShenandoahPhaseTimings::SystemDictionaryRoots),
_jvmti_root(&JvmtiExport::oops_do, phase, ShenandoahPhaseTimings::JVMTIRoots) {
}
void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
@ -74,26 +75,27 @@ void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
_jvmti_root.oops_do(cl, worker_id);
}
ShenandoahWeakSerialRoot::ShenandoahWeakSerialRoot(ShenandoahWeakSerialRoot::WeakOopsDo weak_oops_do, ShenandoahPhaseTimings::ParPhase par_phase) :
_weak_oops_do(weak_oops_do), _par_phase(par_phase) {
ShenandoahWeakSerialRoot::ShenandoahWeakSerialRoot(ShenandoahWeakSerialRoot::WeakOopsDo weak_oops_do,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase) :
_weak_oops_do(weak_oops_do), _phase(phase), _par_phase(par_phase) {
}
void ShenandoahWeakSerialRoot::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) {
if (_claimed.try_set()) {
ShenandoahWorkerTimingsTracker timer(_par_phase, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, _par_phase, worker_id);
_weak_oops_do(is_alive, keep_alive);
}
}
#if INCLUDE_JVMTI
ShenandoahJVMTIWeakRoot::ShenandoahJVMTIWeakRoot() :
ShenandoahWeakSerialRoot(&JvmtiExport::weak_oops_do, ShenandoahPhaseTimings::JVMTIWeakRoots) {
ShenandoahJVMTIWeakRoot::ShenandoahJVMTIWeakRoot(ShenandoahPhaseTimings::Phase phase) :
ShenandoahWeakSerialRoot(&JvmtiExport::weak_oops_do, phase, ShenandoahPhaseTimings::JVMTIWeakRoots) {
}
#endif // INCLUDE_JVMTI
#if INCLUDE_JFR
ShenandoahJFRWeakRoot::ShenandoahJFRWeakRoot() :
ShenandoahWeakSerialRoot(&Jfr::weak_oops_do, ShenandoahPhaseTimings::JFRWeakRoots) {
ShenandoahJFRWeakRoot::ShenandoahJFRWeakRoot(ShenandoahPhaseTimings::Phase phase) :
ShenandoahWeakSerialRoot(&Jfr::weak_oops_do, phase, ShenandoahPhaseTimings::JFRWeakRoots) {
}
#endif // INCLUDE_JFR
@ -107,18 +109,19 @@ void ShenandoahSerialWeakRoots::weak_oops_do(OopClosure* cl, uint worker_id) {
weak_oops_do(&always_true, cl, worker_id);
}
ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) {
ShenandoahThreadRoots::ShenandoahThreadRoots(ShenandoahPhaseTimings::Phase phase, bool is_par) :
_phase(phase), _is_par(is_par) {
Threads::change_thread_claim_token();
}
void ShenandoahThreadRoots::oops_do(OopClosure* oops_cl, CodeBlobClosure* code_cl, uint worker_id) {
ShenandoahWorkerTimingsTracker timer(ShenandoahPhaseTimings::ThreadRoots, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::ThreadRoots, worker_id);
ResourceMark rm;
Threads::possibly_parallel_oops_do(_is_par, oops_cl, code_cl);
}
void ShenandoahThreadRoots::threads_do(ThreadClosure* tc, uint worker_id) {
ShenandoahWorkerTimingsTracker timer(ShenandoahPhaseTimings::ThreadRoots, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::ThreadRoots, worker_id);
ResourceMark rm;
Threads::possibly_parallel_threads_do(_is_par, tc);
}
@ -127,7 +130,7 @@ ShenandoahThreadRoots::~ShenandoahThreadRoots() {
Threads::assert_all_threads_claimed();
}
ShenandoahStringDedupRoots::ShenandoahStringDedupRoots() {
ShenandoahStringDedupRoots::ShenandoahStringDedupRoots(ShenandoahPhaseTimings::Phase phase) : _phase(phase) {
if (ShenandoahStringDedup::is_enabled()) {
StringDedup::gc_prologue(false);
}
@ -141,7 +144,7 @@ ShenandoahStringDedupRoots::~ShenandoahStringDedupRoots() {
void ShenandoahStringDedupRoots::oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) {
if (ShenandoahStringDedup::is_enabled()) {
ShenandoahStringDedup::parallel_oops_do(is_alive, keep_alive, worker_id);
ShenandoahStringDedup::parallel_oops_do(_phase, is_alive, keep_alive, worker_id);
}
}
@ -184,7 +187,14 @@ ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers,
bool stw_roots_processing,
bool stw_class_unloading) :
ShenandoahRootProcessor(phase),
_thread_roots(n_workers > 1),
_serial_roots(phase),
_vm_roots(phase),
_cld_roots(phase),
_thread_roots(phase, n_workers > 1),
_serial_weak_roots(phase),
_weak_roots(phase),
_dedup_roots(phase),
_code_roots(phase),
_stw_roots_processing(stw_roots_processing),
_stw_class_unloading(stw_class_unloading) {
}
@ -217,12 +227,26 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
ShenandoahRootProcessor(phase),
_thread_roots(n_workers > 1) {
_serial_roots(phase),
_vm_roots(phase),
_cld_roots(phase),
_thread_roots(phase, n_workers > 1),
_serial_weak_roots(phase),
_weak_roots(phase),
_dedup_roots(phase),
_code_roots(phase) {
}
ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
ShenandoahRootProcessor(phase),
_thread_roots(n_workers > 1) {
_serial_roots(phase),
_vm_roots(phase),
_cld_roots(phase),
_thread_roots(phase, n_workers > 1),
_serial_weak_roots(phase),
_weak_roots(phase),
_dedup_roots(phase),
_code_roots(phase) {
assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only");
}
@ -247,9 +271,15 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
_dedup_roots.oops_do(&always_true, oops, worker_id);
}
ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() :
ShenandoahHeapIterationRootScanner::ShenandoahHeapIterationRootScanner() :
ShenandoahRootProcessor(ShenandoahPhaseTimings::heap_iteration_roots),
_thread_roots(false /*is par*/) {
_serial_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_thread_roots(ShenandoahPhaseTimings::heap_iteration_roots, false /*is par*/),
_vm_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_cld_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_serial_weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_weak_roots(ShenandoahPhaseTimings::heap_iteration_roots),
_code_roots(ShenandoahPhaseTimings::heap_iteration_roots) {
}
void ShenandoahHeapIterationRootScanner::roots_do(OopClosure* oops) {

View File

@ -40,10 +40,12 @@ public:
private:
ShenandoahSharedFlag _claimed;
const OopsDo _oops_do;
const ShenandoahPhaseTimings::Phase _phase;
const ShenandoahPhaseTimings::ParPhase _par_phase;
public:
ShenandoahSerialRoot(OopsDo oops_do, ShenandoahPhaseTimings::ParPhase par_phase);
ShenandoahSerialRoot(OopsDo oops_do,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase);
void oops_do(OopClosure* cl, uint worker_id);
};
@ -55,7 +57,7 @@ private:
ShenandoahSerialRoot _system_dictionary_root;
ShenandoahSerialRoot _jvmti_root;
public:
ShenandoahSerialRoots();
ShenandoahSerialRoots(ShenandoahPhaseTimings::Phase phase);
void oops_do(OopClosure* cl, uint worker_id);
};
@ -64,24 +66,26 @@ class ShenandoahWeakSerialRoot {
private:
ShenandoahSharedFlag _claimed;
const WeakOopsDo _weak_oops_do;
const ShenandoahPhaseTimings::Phase _phase;
const ShenandoahPhaseTimings::ParPhase _par_phase;
public:
ShenandoahWeakSerialRoot(WeakOopsDo oops_do, ShenandoahPhaseTimings::ParPhase par_phase);
ShenandoahWeakSerialRoot(WeakOopsDo oops_do,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase);
void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
};
#if INCLUDE_JVMTI
class ShenandoahJVMTIWeakRoot : public ShenandoahWeakSerialRoot {
public:
ShenandoahJVMTIWeakRoot();
ShenandoahJVMTIWeakRoot(ShenandoahPhaseTimings::Phase phase);
};
#endif // INCLUDE_JVMTI
#if INCLUDE_JFR
class ShenandoahJFRWeakRoot : public ShenandoahWeakSerialRoot {
public:
ShenandoahJFRWeakRoot();
ShenandoahJFRWeakRoot(ShenandoahPhaseTimings::Phase phase);
};
#endif // INCLUDE_JFR
@ -90,6 +94,9 @@ private:
JVMTI_ONLY(ShenandoahJVMTIWeakRoot _jvmti_weak_roots;)
JFR_ONLY(ShenandoahJFRWeakRoot _jfr_weak_roots;)
public:
ShenandoahSerialWeakRoots(ShenandoahPhaseTimings::Phase phase) :
JVMTI_ONLY(_jvmti_weak_roots(phase))
JFR_ONLY(JVMTI_ONLY(COMMA)_jfr_weak_roots(phase)) {};
void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
void weak_oops_do(OopClosure* cl, uint worker_id);
};
@ -98,9 +105,11 @@ template <bool CONCURRENT>
class ShenandoahVMRoot {
private:
OopStorage::ParState<CONCURRENT, false /* is_const */> _itr;
const ShenandoahPhaseTimings::Phase _phase;
const ShenandoahPhaseTimings::ParPhase _par_phase;
public:
ShenandoahVMRoot(OopStorage* storage, ShenandoahPhaseTimings::ParPhase par_phase);
ShenandoahVMRoot(OopStorage* storage,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase);
template <typename Closure>
void oops_do(Closure* cl, uint worker_id);
@ -109,17 +118,20 @@ public:
template <bool CONCURRENT>
class ShenandoahWeakRoot : public ShenandoahVMRoot<CONCURRENT> {
public:
ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::ParPhase par_phase);
ShenandoahWeakRoot(OopStorage* storage,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase);
};
template <>
class ShenandoahWeakRoot<false /*concurrent*/> {
private:
OopStorage::ParState<false /*concurrent*/, false /*is_const*/> _itr;
const ShenandoahPhaseTimings::Phase _phase;
const ShenandoahPhaseTimings::ParPhase _par_phase;
public:
ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::ParPhase par_phase);
ShenandoahWeakRoot(OopStorage* storage,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase);
template <typename IsAliveClosure, typename KeepAliveClosure>
void weak_oops_do(IsAliveClosure* is_alive, KeepAliveClosure* keep_alive, uint worker_id);
@ -148,7 +160,7 @@ private:
ShenandoahWeakRoot<false /*concurrent*/> _resolved_method_table_roots;
ShenandoahWeakRoot<false /*concurrent*/> _vm_roots;
public:
ShenandoahWeakRoots();
ShenandoahWeakRoots(ShenandoahPhaseTimings::Phase phase);
template <typename Closure>
void oops_do(Closure* cl, uint worker_id);
@ -164,7 +176,7 @@ private:
ShenandoahVMRoot<CONCURRENT> _vm_global_roots;
public:
ShenandoahVMRoots();
ShenandoahVMRoots(ShenandoahPhaseTimings::Phase phase);
template <typename T>
void oops_do(T* cl, uint worker_id);
@ -172,9 +184,10 @@ public:
class ShenandoahThreadRoots {
private:
ShenandoahPhaseTimings::Phase _phase;
const bool _is_par;
public:
ShenandoahThreadRoots(bool is_par);
ShenandoahThreadRoots(ShenandoahPhaseTimings::Phase phase, bool is_par);
~ShenandoahThreadRoots();
void oops_do(OopClosure* oops_cl, CodeBlobClosure* code_cl, uint worker_id);
@ -182,8 +195,10 @@ public:
};
class ShenandoahStringDedupRoots {
private:
ShenandoahPhaseTimings::Phase _phase;
public:
ShenandoahStringDedupRoots();
ShenandoahStringDedupRoots(ShenandoahPhaseTimings::Phase phase);
~ShenandoahStringDedupRoots();
void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
@ -200,9 +215,10 @@ public:
template <typename ITR>
class ShenandoahCodeCacheRoots {
private:
ShenandoahPhaseTimings::Phase _phase;
ITR _coderoots_iterator;
public:
ShenandoahCodeCacheRoots();
ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase);
~ShenandoahCodeCacheRoots();
void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
@ -210,8 +226,10 @@ public:
template <bool CONCURRENT, bool SINGLE_THREADED>
class ShenandoahClassLoaderDataRoots {
private:
ShenandoahPhaseTimings::Phase _phase;
public:
ShenandoahClassLoaderDataRoots();
ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase);
~ShenandoahClassLoaderDataRoots();
void always_strong_cld_do(CLDClosure* clds, uint worker_id);

View File

@ -40,8 +40,9 @@
#include "runtime/safepoint.hpp"
template <bool CONCURRENT>
inline ShenandoahVMRoot<CONCURRENT>::ShenandoahVMRoot(OopStorage* storage, ShenandoahPhaseTimings::ParPhase par_phase) :
_itr(storage), _par_phase(par_phase) {
inline ShenandoahVMRoot<CONCURRENT>::ShenandoahVMRoot(OopStorage* storage,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase) :
_itr(storage), _phase(phase), _par_phase(par_phase) {
}
template <bool CONCURRENT>
@ -50,23 +51,25 @@ inline void ShenandoahVMRoot<CONCURRENT>::oops_do(Closure* cl, uint worker_id) {
if (CONCURRENT) {
_itr.oops_do(cl);
} else {
ShenandoahWorkerTimingsTracker timer(_par_phase, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, _par_phase, worker_id);
_itr.oops_do(cl);
}
}
template <bool CONCURRENT>
inline ShenandoahWeakRoot<CONCURRENT>::ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::ParPhase par_phase) :
ShenandoahVMRoot<CONCURRENT>(storage, par_phase) {
inline ShenandoahWeakRoot<CONCURRENT>::ShenandoahWeakRoot(OopStorage* storage,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase) :
ShenandoahVMRoot<CONCURRENT>(storage, phase, par_phase) {
}
inline ShenandoahWeakRoot<false>::ShenandoahWeakRoot(OopStorage* storage, ShenandoahPhaseTimings::ParPhase par_phase) :
_itr(storage), _par_phase(par_phase) {
inline ShenandoahWeakRoot<false>::ShenandoahWeakRoot(OopStorage* storage,
ShenandoahPhaseTimings::Phase phase, ShenandoahPhaseTimings::ParPhase par_phase) :
_itr(storage), _phase(phase), _par_phase(par_phase) {
}
template <typename IsAliveClosure, typename KeepAliveClosure>
void ShenandoahWeakRoot<false /* concurrent */>::weak_oops_do(IsAliveClosure* is_alive, KeepAliveClosure* keep_alive, uint worker_id) {
ShenandoahWorkerTimingsTracker timer(_par_phase, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, _par_phase, worker_id);
_itr.weak_oops_do(is_alive, keep_alive);
}
@ -87,11 +90,11 @@ void ShenandoahWeakRoots<CONCURRENT>::oops_do(Closure* cl, uint worker_id) {
_vm_roots.oops_do(cl, worker_id);
}
inline ShenandoahWeakRoots<false /* concurrent */>::ShenandoahWeakRoots() :
_jni_roots(OopStorageSet::jni_weak(), ShenandoahPhaseTimings::JNIWeakRoots),
_string_table_roots(OopStorageSet::string_table_weak(), ShenandoahPhaseTimings::StringTableRoots),
_resolved_method_table_roots(OopStorageSet::resolved_method_table_weak(), ShenandoahPhaseTimings::ResolvedMethodTableRoots),
_vm_roots(OopStorageSet::vm_weak(), ShenandoahPhaseTimings::VMWeakRoots) {
inline ShenandoahWeakRoots<false /* concurrent */>::ShenandoahWeakRoots(ShenandoahPhaseTimings::Phase phase) :
_jni_roots(OopStorageSet::jni_weak(), phase, ShenandoahPhaseTimings::JNIWeakRoots),
_string_table_roots(OopStorageSet::string_table_weak(), phase, ShenandoahPhaseTimings::StringTableRoots),
_resolved_method_table_roots(OopStorageSet::resolved_method_table_weak(), phase, ShenandoahPhaseTimings::ResolvedMethodTableRoots),
_vm_roots(OopStorageSet::vm_weak(), phase, ShenandoahPhaseTimings::VMWeakRoots) {
}
template <typename IsAliveClosure, typename KeepAliveClosure>
@ -109,9 +112,9 @@ void ShenandoahWeakRoots<false /* concurrent */>::oops_do(Closure* cl, uint work
}
template <bool CONCURRENT>
ShenandoahVMRoots<CONCURRENT>::ShenandoahVMRoots() :
_jni_handle_roots(OopStorageSet::jni_global(), ShenandoahPhaseTimings::JNIRoots),
_vm_global_roots(OopStorageSet::vm_global(), ShenandoahPhaseTimings::VMGlobalRoots) {
ShenandoahVMRoots<CONCURRENT>::ShenandoahVMRoots(ShenandoahPhaseTimings::Phase phase) :
_jni_handle_roots(OopStorageSet::jni_global(), phase, ShenandoahPhaseTimings::JNIRoots),
_vm_global_roots(OopStorageSet::vm_global(), phase, ShenandoahPhaseTimings::VMGlobalRoots) {
}
template <bool CONCURRENT>
@ -122,7 +125,8 @@ void ShenandoahVMRoots<CONCURRENT>::oops_do(T* cl, uint worker_id) {
}
template <bool CONCURRENT, bool SINGLE_THREADED>
ShenandoahClassLoaderDataRoots<CONCURRENT, SINGLE_THREADED>::ShenandoahClassLoaderDataRoots() {
ShenandoahClassLoaderDataRoots<CONCURRENT, SINGLE_THREADED>::ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase) :
_phase(phase) {
if (!SINGLE_THREADED) {
ClassLoaderDataGraph::clear_claimed_marks();
}
@ -148,7 +152,7 @@ void ShenandoahClassLoaderDataRoots<CONCURRENT, SINGLE_THREADED>::always_strong_
} else if (CONCURRENT) {
ClassLoaderDataGraph::always_strong_cld_do(clds);
} else {
ShenandoahWorkerTimingsTracker timer(ShenandoahPhaseTimings::CLDGRoots, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::CLDGRoots, worker_id);
ClassLoaderDataGraph::always_strong_cld_do(clds);
}
}
@ -162,19 +166,19 @@ void ShenandoahClassLoaderDataRoots<CONCURRENT, SINGLE_THREADED>::cld_do(CLDClos
} else if (CONCURRENT) {
ClassLoaderDataGraph::cld_do(clds);
} else {
ShenandoahWorkerTimingsTracker timer(ShenandoahPhaseTimings::CLDGRoots, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::CLDGRoots, worker_id);
ClassLoaderDataGraph::cld_do(clds);
}
}
template <typename ITR>
ShenandoahCodeCacheRoots<ITR>::ShenandoahCodeCacheRoots() {
ShenandoahCodeCacheRoots<ITR>::ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase) : _phase(phase) {
nmethod::oops_do_marking_prologue();
}
template <typename ITR>
void ShenandoahCodeCacheRoots<ITR>::code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id) {
ShenandoahWorkerTimingsTracker timer(ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::CodeCacheRoots, worker_id);
_coderoots_iterator.possibly_parallel_blobs_do(blob_cl);
}
@ -203,7 +207,12 @@ public:
template <typename ITR>
ShenandoahRootScanner<ITR>::ShenandoahRootScanner(uint n_workers, ShenandoahPhaseTimings::Phase phase) :
ShenandoahRootProcessor(phase),
_thread_roots(n_workers > 1) {
_serial_roots(phase),
_thread_roots(phase, n_workers > 1),
_code_roots(phase),
_vm_roots(phase),
_dedup_roots(phase),
_cld_roots(phase) {
}
template <typename ITR>

View File

@ -72,18 +72,19 @@ void ShenandoahStringDedup::deduplicate(oop java_string) {
StringDedupTable::deduplicate(java_string, &dummy);
}
void ShenandoahStringDedup::parallel_oops_do(BoolObjectClosure* is_alive, OopClosure* cl, uint worker_id) {
void ShenandoahStringDedup::parallel_oops_do(ShenandoahPhaseTimings::Phase phase,
BoolObjectClosure* is_alive, OopClosure* cl, uint worker_id) {
assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
assert(is_enabled(), "String deduplication not enabled");
StringDedupUnlinkOrOopsDoClosure sd_cl(is_alive, cl);
{
ShenandoahWorkerTimingsTracker x(ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id);
ShenandoahWorkerTimingsTracker x(phase, ShenandoahPhaseTimings::StringDedupQueueRoots, worker_id);
StringDedupQueue::unlink_or_oops_do(&sd_cl);
}
{
ShenandoahWorkerTimingsTracker x(ShenandoahPhaseTimings::StringDedupTableRoots, worker_id);
ShenandoahWorkerTimingsTracker x(phase, ShenandoahPhaseTimings::StringDedupTableRoots, worker_id);
StringDedupTable::unlink_or_oops_do(&sd_cl, worker_id);
}
}

View File

@ -26,6 +26,7 @@
#define SHARE_GC_SHENANDOAH_SHENANDOAHSTRINGDEDUP_HPP
#include "gc/shared/stringdedup/stringDedup.hpp"
#include "gc/shenandoah/shenandoahPhaseTimings.hpp"
#include "memory/iterator.hpp"
class ShenandoahStringDedup : public StringDedup {
@ -39,7 +40,11 @@ public:
// Deduplicate a string, the call is lock-free
static void deduplicate(oop java_string);
static void parallel_oops_do(BoolObjectClosure* is_alive, OopClosure* cl, uint worker_id);
static void parallel_oops_do(ShenandoahPhaseTimings::Phase phase,
BoolObjectClosure* is_alive,
OopClosure* cl,
uint worker_id);
static void oops_do_slow(OopClosure* cl);
static inline bool is_candidate(oop obj);

View File

@ -125,22 +125,6 @@ bool ShenandoahGCPhase::is_current_phase_valid() {
return _current_phase < ShenandoahPhaseTimings::_num_phases;
}
bool ShenandoahGCPhase::is_root_work_phase() {
switch(current_phase()) {
case ShenandoahPhaseTimings::scan_roots:
case ShenandoahPhaseTimings::update_roots:
case ShenandoahPhaseTimings::init_evac:
case ShenandoahPhaseTimings::final_update_refs_roots:
case ShenandoahPhaseTimings::degen_gc_update_roots:
case ShenandoahPhaseTimings::full_gc_scan_roots:
case ShenandoahPhaseTimings::full_gc_update_roots:
case ShenandoahPhaseTimings::full_gc_adjust_roots:
return true;
default:
return false;
}
}
ShenandoahGCSubPhase::ShenandoahGCSubPhase(ShenandoahPhaseTimings::Phase phase) :
ShenandoahGCPhase(phase),
_timer(ShenandoahHeap::heap()->gc_timer()) {

View File

@ -90,7 +90,6 @@ public:
static ShenandoahPhaseTimings::Phase current_phase() { return _current_phase; }
static bool is_current_phase_valid();
static bool is_root_work_phase();
};
class ShenandoahGCSubPhase: public ShenandoahGCPhase {