# HG changeset patch # Parent 5b2f501173749e960a53f2a9f48ac4a58e20f8f3 8234974: Shenandoah: Do concurrent roots even when no evacuation is necessary diff -r 5b2f50117374 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Wed Dec 11 15:01:11 2019 -0500 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Wed Dec 11 22:05:55 2019 +0100 @@ -264,13 +264,8 @@ } ShenandoahMarkingContext* const marking_context = _heap->marking_context(); - if (_heap->is_evacuation_in_progress() && !marking_context->is_marked(obj)) { - Thread* thr = Thread::current(); - if (thr->is_Java_thread()) { - return NULL; - } else { - return obj; - } + if (_heap->is_concurrent_root_in_progress() && !marking_context->is_marked(obj)) { + return NULL; } oop fwd = load_reference_barrier_not_null(obj); diff -r 5b2f50117374 src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp Wed Dec 11 15:01:11 2019 -0500 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp Wed Dec 11 22:05:55 2019 +0100 @@ -57,8 +57,10 @@ } // Heal oops and disarm - ShenandoahEvacOOMScope scope; - ShenandoahNMethod::heal_nmethod(nm); + if (ShenandoahHeap::heap()->is_evacuation_in_progress()) { + ShenandoahEvacOOMScope scope; + ShenandoahNMethod::heal_nmethod(nm); + } ShenandoahNMethod::disarm_nmethod(nm); return true; } diff -r 5b2f50117374 src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp Wed Dec 11 15:01:11 2019 -0500 +++ b/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp Wed Dec 11 22:05:55 2019 +0100 @@ -111,12 +111,13 @@ template void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p) { - assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); + assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress"); T o = RawAccess<>::oop_load(p); if (! CompressedOops::is_null(o)) { oop obj = CompressedOops::decode_not_null(o); if (_heap->in_collection_set(obj)) { + assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { @@ -139,11 +140,12 @@ } void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) { - assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); + assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress"); oop obj = RawAccess<>::oop_load(p); if (! CompressedOops::is_null(obj)) { if (_heap->in_collection_set(obj)) { + assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { diff -r 5b2f50117374 src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp Wed Dec 11 15:01:11 2019 -0500 +++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp Wed Dec 11 22:05:55 2019 +0100 @@ -224,7 +224,9 @@ // Heal oops and disarm ShenandoahEvacOOMScope evac_scope; - ShenandoahNMethod::heal_nmethod(nm); + if (_heap->is_evacuation_in_progress()) { + ShenandoahNMethod::heal_nmethod(nm); + } ShenandoahNMethod::disarm_nmethod(nm); // Clear compiled ICs and exception caches diff -r 5b2f50117374 src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Wed Dec 11 15:01:11 2019 -0500 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Wed Dec 11 22:05:55 2019 +0100 @@ -542,6 +542,7 @@ if (is_degenerated_gc_in_progress()) st->print("degenerated gc, "); if (is_full_gc_in_progress()) st->print("full gc, "); if (is_full_gc_move_in_progress()) st->print("full gc move, "); + if (is_concurrent_root_in_progress()) st->print("concurrent roots, "); if (cancelled_gc()) { st->print("cancelled"); @@ -1540,6 +1541,11 @@ _free_set->rebuild(); } + if (!is_degenerated_gc_in_progress()) { + prepare_concurrent_roots(); + prepare_concurrent_unloading(); + } + // If collection set has candidates, start evacuation. // Otherwise, bypass the rest of the cycle. if (!collection_set()->is_empty()) { @@ -1554,8 +1560,6 @@ set_has_forwarded_objects(true); if (!is_degenerated_gc_in_progress()) { - prepare_concurrent_roots(); - prepare_concurrent_unloading(); evacuate_and_update_roots(); } @@ -1669,12 +1673,12 @@ }; void ShenandoahHeap::op_roots() { - if (is_evacuation_in_progress()) { + if (is_concurrent_root_in_progress()) { if (ShenandoahConcurrentRoots::should_do_concurrent_class_unloading()) { _unloader.unload(); } - if (ShenandoahConcurrentRoots::should_do_concurrent_roots()) { + if (ShenandoahConcurrentRoots::should_do_concurrent_roots() && is_concurrent_root_in_progress()) { ShenandoahConcurrentRootsEvacUpdateTask task; workers()->run_task(&task); } diff -r 5b2f50117374 src/hotspot/share/gc/shenandoah/shenandoahUnload.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahUnload.cpp Wed Dec 11 15:01:11 2019 -0500 +++ b/src/hotspot/share/gc/shenandoah/shenandoahUnload.cpp Wed Dec 11 22:05:55 2019 +0100 @@ -79,7 +79,7 @@ public: virtual bool is_unloading(CompiledMethod* method) const { nmethod* const nm = method->as_nmethod(); - guarantee(ShenandoahHeap::heap()->is_evacuation_in_progress(), "Only this phase"); + guarantee(ShenandoahHeap::heap()->is_concurrent_root_in_progress(), "Only this phase"); ShenandoahNMethod* data = ShenandoahNMethod::gc_data(nm); ShenandoahReentrantLocker locker(data->lock()); ShenandoahIsUnloadingOopClosure cl; @@ -166,7 +166,7 @@ void ShenandoahUnload::unload() { assert(ShenandoahConcurrentRoots::can_do_concurrent_class_unloading(), "Why we here?"); - if (!ShenandoahHeap::heap()->is_evacuation_in_progress()) { + if (!ShenandoahHeap::heap()->is_concurrent_root_in_progress()) { return; }