< prev index next >

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

Print this page

        

*** 28,38 **** #include "gc/shared/referenceProcessor.hpp" #include "gc/shared/referenceProcessorPhaseTimes.hpp" #include "gc/shared/workgroup.hpp" #include "gc/shared/weakProcessor.inline.hpp" #include "gc/shenandoah/shenandoahBarrierSet.hpp" - #include "gc/shenandoah/shenandoahClosures.inline.hpp" #include "gc/shenandoah/shenandoahCodeRoots.hpp" #include "gc/shenandoah/shenandoahCollectionSet.hpp" #include "gc/shenandoah/shenandoahCollectorPolicy.hpp" #include "gc/shenandoah/shenandoahFreeSet.hpp" #include "gc/shenandoah/shenandoahPhaseTimings.hpp" --- 28,37 ----
*** 195,208 **** ShenandoahWorkerTimingsTracker timer(worker_times, ShenandoahPhaseTimings::CodeCacheRoots, worker_id); _cset_coderoots->possibly_parallel_blobs_do(&code_cl); } else { _rp->process_all_roots(&roots_cl, &cld_cl, &code_cl, NULL, worker_id); } - if (ShenandoahStringDedup::is_enabled()) { - AlwaysTrueClosure is_alive; - ShenandoahStringDedup::parallel_oops_do(&is_alive, &roots_cl, worker_id); - } } } }; class ShenandoahConcurrentTraversalCollectionTask : public AbstractGangTask { --- 194,203 ----
*** 598,611 **** if (!_heap->cancelled_gc() && _heap->process_references()) { weak_refs_work(); } if (!_heap->cancelled_gc()) { - fixup_roots(); if (_heap->unload_classes()) { _heap->unload_classes_and_cleanup_tables(false); } } if (!_heap->cancelled_gc()) { assert(_task_queues->is_empty(), "queues must be empty after traversal GC"); TASKQUEUE_STATS_ONLY(_task_queues->print_taskqueue_stats()); --- 593,607 ---- if (!_heap->cancelled_gc() && _heap->process_references()) { weak_refs_work(); } if (!_heap->cancelled_gc()) { if (_heap->unload_classes()) { _heap->unload_classes_and_cleanup_tables(false); } + + fixup_roots(); } if (!_heap->cancelled_gc()) { assert(_task_queues->is_empty(), "queues must be empty after traversal GC"); TASKQUEUE_STATS_ONLY(_task_queues->print_taskqueue_stats());
*** 771,780 **** --- 767,799 ---- void do_oop(narrowOop* p) { do_oop_work(p); } void do_oop(oop* p) { do_oop_work(p); } }; + class ShenandoahTraversalWeakUpdateClosure : public OopClosure { + private: + template <class T> + inline void do_oop_work(T* p) { + // Cannot call maybe_update_with_forwarded, because on traversal-degen + // path the collection set is already dropped. Instead, do the unguarded store. + // TODO: This can be fixed after degen-traversal stops dropping cset. + T o = RawAccess<>::oop_load(p); + if (!CompressedOops::is_null(o)) { + oop obj = CompressedOops::decode_not_null(o); + obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); + shenandoah_assert_marked(p, obj); + RawAccess<IS_NOT_NULL>::oop_store(p, obj); + } + } + + public: + ShenandoahTraversalWeakUpdateClosure() {} + + void do_oop(narrowOop* p) { do_oop_work(p); } + void do_oop(oop* p) { do_oop_work(p); } + }; + class ShenandoahTraversalKeepAliveUpdateDegenClosure : public OopClosure { private: ShenandoahObjToScanQueue* _queue; Thread* _thread; ShenandoahTraversalGC* _traversal_gc;
*** 1083,1090 **** rp->process_discovered_references(&is_alive, &keep_alive, &complete_gc, &executor, &pt); } ! pt.print_all_references(); ! assert(task_queues()->is_empty() || _heap->cancelled_gc(), "Should be empty"); } --- 1102,1119 ---- rp->process_discovered_references(&is_alive, &keep_alive, &complete_gc, &executor, &pt); } ! { ! ShenandoahGCPhase phase(phase_process); ! ShenandoahTerminationTracker termination(ShenandoahPhaseTimings::weakrefs_termination); ! ! // Process leftover weak oops (using parallel version) ! ShenandoahTraversalWeakUpdateClosure cl; ! WeakProcessor::weak_oops_do(workers, &is_alive, &cl, 1); ! ! pt.print_all_references(); ! ! assert(task_queues()->is_empty() || _heap->cancelled_gc(), "Should be empty"); ! } }
< prev index next >