< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp

Print this page
rev 55429 : 8226311: Shenandoah: Concurrent evacuation of OopStorage backed weak roots

*** 25,44 **** #include "classfile/classLoaderDataGraph.hpp" #include "classfile/stringTable.hpp" #include "classfile/systemDictionary.hpp" #include "code/codeCache.hpp" - #include "gc/shenandoah/shenandoahClosures.inline.hpp" #include "gc/shenandoah/shenandoahRootProcessor.inline.hpp" #include "gc/shenandoah/shenandoahHeap.hpp" - #include "gc/shenandoah/shenandoahHeuristics.hpp" #include "gc/shenandoah/shenandoahPhaseTimings.hpp" #include "gc/shenandoah/shenandoahStringDedup.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp" #include "gc/shenandoah/shenandoahVMOperations.hpp" ! #include "gc/shared/weakProcessor.inline.hpp" ! #include "memory/allocation.inline.hpp" #include "memory/iterator.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "runtime/thread.hpp" #include "services/management.hpp" --- 25,41 ---- #include "classfile/classLoaderDataGraph.hpp" #include "classfile/stringTable.hpp" #include "classfile/systemDictionary.hpp" #include "code/codeCache.hpp" #include "gc/shenandoah/shenandoahRootProcessor.inline.hpp" #include "gc/shenandoah/shenandoahHeap.hpp" #include "gc/shenandoah/shenandoahPhaseTimings.hpp" #include "gc/shenandoah/shenandoahStringDedup.hpp" #include "gc/shenandoah/shenandoahTimingTracker.hpp" #include "gc/shenandoah/shenandoahVMOperations.hpp" ! #include "jfr/jfr.hpp" #include "memory/iterator.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "runtime/thread.hpp" #include "services/management.hpp"
*** 69,78 **** --- 66,109 ---- _management_root.oops_do(cl, worker_id); _system_dictionary_root.oops_do(cl, worker_id); _jvmti_root.oops_do(cl, worker_id); } + ShenandoahWeakSerialRoot::ShenandoahWeakSerialRoot(ShenandoahWeakSerialRoot::WeakOopsDo weak_oops_do, ShenandoahPhaseTimings::GCParPhases phase) : + _weak_oops_do(weak_oops_do), _phase(phase) { + } + + void ShenandoahWeakSerialRoot::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) { + if (_claimed.try_set()) { + ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); + ShenandoahWorkerTimingsTracker timer(worker_times, _phase, worker_id); + _weak_oops_do(is_alive, keep_alive); + } + } + + #if INCLUDE_JVMTI + ShenandoahJVMTIWeakRoot::ShenandoahJVMTIWeakRoot() : + ShenandoahWeakSerialRoot(&JvmtiExport::weak_oops_do, ShenandoahPhaseTimings::JVMTIWeakRoots) { + } + #endif // INCLUDE_JVMTI + + #if INCLUDE_JFR + ShenandoahJFRWeakRoot::ShenandoahJFRWeakRoot() : + ShenandoahWeakSerialRoot(&Jfr::weak_oops_do, ShenandoahPhaseTimings::JFRWeakRoots) { + } + #endif // INCLUDE_JFR + + void ShenandoahSerialWeakRoots::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id) { + JVMTI_ONLY(_jvmti_weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);) + JFR_ONLY(_jfr_weak_roots.weak_oops_do(is_alive, keep_alive, worker_id);) + } + + void ShenandoahSerialWeakRoots::weak_oops_do(OopClosure* cl, uint worker_id) { + AlwaysTrueClosure always_true; + weak_oops_do(&always_true, cl, worker_id); + } + ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) { Threads::change_thread_claim_token(); } void ShenandoahThreadRoots::oops_do(OopClosure* oops_cl, CodeBlobClosure* code_cl, uint worker_id) {
*** 91,111 **** ShenandoahThreadRoots::~ShenandoahThreadRoots() { Threads::assert_all_threads_claimed(); } - ShenandoahWeakRoots::ShenandoahWeakRoots(uint n_workers) : - _process_timings(n_workers), - _task(&_process_timings, n_workers) { - } - - ShenandoahWeakRoots::~ShenandoahWeakRoots() { - ShenandoahWorkerTimings* worker_times = ShenandoahHeap::heap()->phase_timings()->worker_times(); - ShenandoahTimingConverter::weak_processing_timing_to_shenandoah_timing(&_process_timings, - worker_times); - } - ShenandoahStringDedupRoots::ShenandoahStringDedupRoots() { if (ShenandoahStringDedup::is_enabled()) { StringDedup::gc_prologue(false); } } --- 122,131 ----
*** 145,187 **** } ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), - _weak_roots(n_workers), _include_concurrent_roots(include_concurrent_roots) { } void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) { MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations); CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); if (_include_concurrent_roots) { _jni_roots.oops_do<OopClosure>(oops, worker_id); } _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.clds_do(&clds, &clds, worker_id); _code_roots.code_blobs_do(&blobsCl, worker_id); - _weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); } ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool update_code_cache) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), - _weak_roots(n_workers), _update_code_cache(update_code_cache) { } ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) : ShenandoahRootProcessor(phase), ! _thread_roots(n_workers > 1), ! _weak_roots(n_workers) { assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only"); } void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) { CodeBlobToOopClosure adjust_code_closure(oops, CodeBlobToOopClosure::FixRelocations); --- 165,205 ---- } ShenandoahRootEvacuator::ShenandoahRootEvacuator(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool include_concurrent_roots) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), _include_concurrent_roots(include_concurrent_roots) { } void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) { MarkingCodeBlobClosure blobsCl(oops, CodeBlobToOopClosure::FixRelocations); CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong); AlwaysTrueClosure always_true; _serial_roots.oops_do(oops, worker_id); + _serial_weak_roots.weak_oops_do(oops, worker_id); if (_include_concurrent_roots) { _jni_roots.oops_do<OopClosure>(oops, worker_id); + _weak_roots.oops_do<OopClosure>(oops, worker_id); } _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.clds_do(&clds, &clds, worker_id); _code_roots.code_blobs_do(&blobsCl, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); } ShenandoahRootUpdater::ShenandoahRootUpdater(uint n_workers, ShenandoahPhaseTimings::Phase phase, bool update_code_cache) : ShenandoahRootProcessor(phase), _thread_roots(n_workers > 1), _update_code_cache(update_code_cache) { } ShenandoahRootAdjuster::ShenandoahRootAdjuster(uint n_workers, ShenandoahPhaseTimings::Phase phase) : ShenandoahRootProcessor(phase), ! _thread_roots(n_workers > 1) { assert(ShenandoahHeap::heap()->is_full_gc_in_progress(), "Full GC only"); } void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) { CodeBlobToOopClosure adjust_code_closure(oops, CodeBlobToOopClosure::FixRelocations);
*** 193,200 **** _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id); _code_roots.code_blobs_do(&adjust_code_closure, worker_id); ! _weak_roots.oops_do<AlwaysTrueClosure, OopClosure>(&always_true, oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); } --- 211,219 ---- _thread_roots.oops_do(oops, NULL, worker_id); _cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id); _code_roots.code_blobs_do(&adjust_code_closure, worker_id); ! _serial_weak_roots.weak_oops_do(oops, worker_id); ! _weak_roots.oops_do<OopClosure>(oops, worker_id); _dedup_roots.oops_do(&always_true, oops, worker_id); }
< prev index next >