< prev index next >

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

Print this page
rev 55405 : 8225573: Shenandoah: Enhance ShenandoahVerifier to ensure roots to-space invariant
rev 55406 : 8225582: Shenandoah: Enable concurrent evacuation of JNIHandles

*** 36,45 **** --- 36,46 ---- #include "gc/shenandoah/shenandoahBarrierSet.hpp" #include "gc/shenandoah/shenandoahClosures.inline.hpp" #include "gc/shenandoah/shenandoahCollectionSet.hpp" #include "gc/shenandoah/shenandoahCollectorPolicy.hpp" #include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp" + #include "gc/shenandoah/shenandoahConcurrentRoots.hpp" #include "gc/shenandoah/shenandoahControlThread.hpp" #include "gc/shenandoah/shenandoahFreeSet.hpp" #include "gc/shenandoah/shenandoahPhaseTimings.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" #include "gc/shenandoah/shenandoahHeapRegion.hpp"
*** 1069,1081 **** void ShenandoahHeap::evacuate_and_update_roots() { #if COMPILER2_OR_JVMCI DerivedPointerTable::clear(); #endif assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only iterate roots while world is stopped"); - { ! ShenandoahRootEvacuator rp(workers()->active_workers(), ShenandoahPhaseTimings::init_evac); ShenandoahEvacuateUpdateRootsTask roots_task(&rp); workers()->run_task(&roots_task); } #if COMPILER2_OR_JVMCI --- 1070,1084 ---- void ShenandoahHeap::evacuate_and_update_roots() { #if COMPILER2_OR_JVMCI DerivedPointerTable::clear(); #endif assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Only iterate roots while world is stopped"); { ! // Include concurrent roots if current cycle can not process those roots concurrently ! ShenandoahRootEvacuator rp(workers()->active_workers(), ! ShenandoahPhaseTimings::init_evac, ! !ShenandoahConcurrentRoots::should_do_concurrent_roots()); ShenandoahEvacuateUpdateRootsTask roots_task(&rp); workers()->run_task(&roots_task); } #if COMPILER2_OR_JVMCI
*** 1515,1525 **** --- 1518,1532 ---- if (ShenandoahPacing) { pacer()->setup_for_evac(); } if (ShenandoahVerify) { + if (ShenandoahConcurrentRoots::should_do_concurrent_roots()) { + verifier()->verify_roots_no_forwarded_except(ShenandoahRootVerifier::JNIHandleRoots); + } else { verifier()->verify_roots_no_forwarded(); + } verifier()->verify_during_evacuation(); } } else { if (ShenandoahVerify) { verifier()->verify_after_concmark();
*** 1576,1585 **** --- 1583,1616 ---- void ShenandoahHeap::op_cleanup() { free_set()->recycle_trash(); } + class ShenandoahConcurrentRootsEvacUpdateTask : public AbstractGangTask { + private: + ShenandoahJNIHandleRoots<true /*concurrent*/> _jni_roots; + + public: + ShenandoahConcurrentRootsEvacUpdateTask() : + AbstractGangTask("Shenandoah Evacuate/Update Concurrent Roots Task") { + } + + void work(uint worker_id) { + ShenandoahEvacOOMScope oom; + ShenandoahEvacuateUpdateRootsClosure cl; + _jni_roots.oops_do<ShenandoahEvacuateUpdateRootsClosure>(&cl); + } + }; + + void ShenandoahHeap::op_roots() { + if (is_evacuation_in_progress() && + ShenandoahConcurrentRoots::should_do_concurrent_roots()) { + ShenandoahConcurrentRootsEvacUpdateTask task; + workers()->run_task(&task); + } + } + void ShenandoahHeap::op_reset() { reset_mark_bitmap(); } void ShenandoahHeap::op_preclean() {
*** 2557,2566 **** --- 2588,2613 ---- "concurrent reference update"); try_inject_alloc_failure(); op_updaterefs(); } + + void ShenandoahHeap::entry_roots() { + ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_roots); + + static const char* msg = "Concurrent roots processing"; + GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true); + EventMark em("%s", msg); + + ShenandoahWorkerScope scope(workers(), + ShenandoahWorkerPolicy::calc_workers_for_conc_root_processing(), + "concurrent root processing"); + + try_inject_alloc_failure(); + op_roots(); + } + void ShenandoahHeap::entry_cleanup() { ShenandoahGCPhase phase(ShenandoahPhaseTimings::conc_cleanup); static const char* msg = "Concurrent cleanup"; GCTraceTime(Info, gc) time(msg, NULL, GCCause::_no_gc, true);
< prev index next >