< prev index next >
src/share/vm/gc/shenandoah/shenandoahPartialGC.cpp
Print this page
rev 13131 : Improve inlining of the root scanning closure in partial GC.
*** 29,38 ****
--- 29,39 ----
#include "gc/shenandoah/shenandoahCollectionSet.hpp"
#include "gc/shenandoah/shenandoahConnectionMatrix.inline.hpp"
#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"
#include "memory/iterator.hpp"
*** 52,78 ****
do_oop_work(p);
}
void do_oop(narrowOop* p) { do_oop_work(p); }
};
- class PartialEvacuateUpdateHeapClosure : public ExtendedOopClosure {
- ShenandoahPartialGC* _partial_gc;
- Thread* _thread;
- SCMObjToScanQueue* _queue;
- private:
- template <class T>
- void do_oop_work(T* p) {
- _partial_gc->process_oop<T, true>(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;
ParallelTaskTerminator* _terminator;
ShenandoahHeapRegionSet* _root_regions;
--- 53,62 ----
*** 322,362 ****
_heap->collection_set()->clear();
_heap->clear_cset_fast_test();
_root_regions->clear();
}
- template <class T, bool UPDATE_MATRIX>
- 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;
}
--- 306,313 ----
< prev index next >