# HG changeset patch # User rkennke # Date 1490903211 -7200 # Thu Mar 30 21:46:51 2017 +0200 # Node ID 6ef139806b0516e2ab01628d3a5be8b58ebf5fda # Parent 85ad2bfde517205f6e8f7da4e0b23faccee95665 Improve inlining of the root scanning closure in partial GC. diff --git a/src/share/vm/gc/shenandoah/shenandoahOopClosures.hpp b/src/share/vm/gc/shenandoah/shenandoahOopClosures.hpp --- a/src/share/vm/gc/shenandoah/shenandoahOopClosures.hpp +++ b/src/share/vm/gc/shenandoah/shenandoahOopClosures.hpp @@ -182,5 +182,21 @@ virtual void do_oop(oop* p) { do_oop_nv(p); } }; +class PartialEvacuateUpdateHeapClosure : public ExtendedOopClosure { + ShenandoahPartialGC* _partial_gc; + Thread* _thread; + SCMObjToScanQueue* _queue; +public: + PartialEvacuateUpdateHeapClosure(SCMObjToScanQueue* q) : + _partial_gc(ShenandoahHeap::heap()->partial_gc()), + _thread(Thread::current()), _queue(q) {} + + template + void do_oop_nv(T* p); + + void do_oop(oop* p) { do_oop_nv(p); } + void do_oop(narrowOop* p) { do_oop_nv(p); } +}; + #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP diff --git a/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp b/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp --- a/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp +++ b/src/share/vm/gc/shenandoah/shenandoahOopClosures.inline.hpp @@ -26,6 +26,7 @@ #include "gc/shenandoah/shenandoahHeap.inline.hpp" #include "gc/shenandoah/shenandoahConcurrentMark.inline.hpp" +#include "gc/shenandoah/shenandoahPartialGC.inline.hpp" template inline void ShenandoahMarkRefsSuperClosure::work(T *p) { @@ -40,4 +41,9 @@ } } +template +inline void PartialEvacuateUpdateHeapClosure::do_oop_nv(T* p) { + _partial_gc->process_oop(p, _thread, _queue); +} + #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_INLINE_HPP diff --git a/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp b/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp --- a/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp +++ b/src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp @@ -31,6 +31,7 @@ #include "gc/shenandoah/shenandoahFreeSet.hpp" #include "gc/shenandoah/shenandoahHeapRegionSet.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" +#include "gc/shenandoah/shenandoahOopClosures.inline.hpp" #include "gc/shenandoah/shenandoahPartialGC.hpp" #include "gc/shenandoah/shenandoahRootProcessor.hpp" #include "gc/shenandoah/shenandoahTaskqueue.hpp" @@ -54,23 +55,6 @@ void do_oop(narrowOop* p) { do_oop_work(p); } }; -class PartialEvacuateUpdateHeapClosure : public ExtendedOopClosure { - ShenandoahPartialGC* _partial_gc; - Thread* _thread; - SCMObjToScanQueue* _queue; -private: - template - void do_oop_work(T* p) { - _partial_gc->process_oop(p, _thread, _queue); - } -public: - PartialEvacuateUpdateHeapClosure(SCMObjToScanQueue* q) : - _partial_gc(ShenandoahHeap::heap()->partial_gc()), - _thread(Thread::current()), _queue(q) {} - void do_oop(oop* p) { do_oop_work(p); } - void do_oop(narrowOop* p) { do_oop_work(p); } -}; - class ShenandoahPartialCollectionTask : public AbstractGangTask { private: ShenandoahRootProcessor* _rp; @@ -324,39 +308,6 @@ _root_regions->clear(); } -template -void ShenandoahPartialGC::process_oop(T* p, Thread* thread, SCMObjToScanQueue* queue) { - T o = oopDesc::load_heap_oop(p); - if (! oopDesc::is_null(o)) { - oop obj = oopDesc::decode_heap_oop_not_null(o); - if (_heap->in_collection_set(obj)) { - oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj); - if (oopDesc::unsafe_equals(obj, forw)) { - bool evacuated = false; - forw = _heap->evacuate_object(obj, thread, evacuated); - - // Only the thread that succeeded evacuating this object pushes it to its work queue. - if (evacuated) { - assert(forw->is_oop(), "sanity"); - bool succeeded = queue->push(SCMTask(forw)); - assert(succeeded, "must succeed to push to task queue"); - } - } - assert(! oopDesc::unsafe_equals(obj, forw) || _heap->cancelled_concgc(), "must be evacuated"); - // Update reference. - oopDesc::encode_store_heap_oop_not_null(p, forw); - obj = forw; // For matrix update below. - } - if (UPDATE_MATRIX) { -#ifdef ASSERT - oop forw = ShenandoahBarrierSet::resolve_oop_static_not_null(obj); - assert(oopDesc::unsafe_equals(obj, forw) || _heap->cancelled_concgc(), "must not be evacuated: "PTR_FORMAT" -> "PTR_FORMAT, p2i(obj), p2i(forw)); -#endif - _matrix->set_connected(p, obj); - } - } -} - SCMObjToScanQueueSet* ShenandoahPartialGC::task_queues() { return _task_queues; } diff --git a/src/share/vm/gc/shenandoah/shenandoah_specialized_oop_closures.hpp b/src/share/vm/gc/shenandoah/shenandoah_specialized_oop_closures.hpp --- a/src/share/vm/gc/shenandoah/shenandoah_specialized_oop_closures.hpp +++ b/src/share/vm/gc/shenandoah/shenandoah_specialized_oop_closures.hpp @@ -33,6 +33,7 @@ class ShenandoahMarkRefsMatrixClosure; class ShenandoahMarkRefsMetadataMatrixClosure; class ShenandoahUpdateHeapRefsClosure; +class PartialEvacuateUpdateHeapClosure; #define SPECIALIZED_OOP_OOP_ITERATE_CLOSURES_SHENANDOAH(f) \ f(ShenandoahMarkUpdateRefsClosure,_nv) \ @@ -43,6 +44,7 @@ f(ShenandoahMarkUpdateRefsMetadataMatrixClosure,_nv) \ f(ShenandoahMarkRefsMatrixClosure,_nv) \ f(ShenandoahMarkRefsMetadataMatrixClosure,_nv) \ - f(ShenandoahUpdateHeapRefsClosure,_nv) + f(ShenandoahUpdateHeapRefsClosure,_nv) \ + f(PartialEvacuateUpdateHeapClosure,_nv) #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAH_SPECIALIZED_OOP_CLOSURES_HPP