--- old/src/share/vm/gc/g1/g1OopClosures.hpp 2017-06-23 11:37:42.784110542 +0200 +++ new/src/share/vm/gc/g1/g1OopClosures.hpp 2017-06-23 11:37:42.655106557 +0200 @@ -25,6 +25,7 @@ #ifndef SHARE_VM_GC_G1_G1OOPCLOSURES_HPP #define SHARE_VM_GC_G1_G1OOPCLOSURES_HPP +#include "gc/g1/g1InCSetState.hpp" #include "memory/iterator.hpp" #include "oops/markOop.hpp" @@ -55,15 +56,40 @@ G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); ~G1ParClosureSuper() { } + template + inline void prefetch_and_push(T* p, oop const obj); + + template + inline void handle_non_cset_obj_common(InCSetState const state, T* p, oop const obj); public: // This closure needs special handling for InstanceRefKlass. virtual ReferenceIterationMode reference_iteration_mode() { return DO_DISCOVERED_AND_DISCOVERY; } }; -class G1ParPushHeapRSClosure : public G1ParClosureSuper { +// Used during the Update RS phase to refine remaining cards in the DCQ during garbage collection. +class G1ScanObjsDuringUpdateRSClosure: public G1ParClosureSuper { + uint _worker_i; + bool _has_refs_into_cset; + +public: + G1ScanObjsDuringUpdateRSClosure(G1CollectedHeap* g1h, + G1ParScanThreadState* pss, + uint worker_i) : + G1ParClosureSuper(g1h, pss), _has_refs_into_cset(false), _worker_i(worker_i) { } + + void reset_has_refs_into_cset() { _has_refs_into_cset = false; } + bool has_refs_into_cset() const { return _has_refs_into_cset; } + + template void do_oop_nv(T* p); + virtual void do_oop(narrowOop* p) { do_oop_nv(p); } + virtual void do_oop(oop* p) { do_oop_nv(p); } +}; + +// Used during the Scan RS phase to scan cards from the remembered set during garbage collection. +class G1ScanObjsDuringScanRSClosure : public G1ParClosureSuper { public: - G1ParPushHeapRSClosure(G1CollectedHeap* g1, - G1ParScanThreadState* par_scan_state): + G1ScanObjsDuringScanRSClosure(G1CollectedHeap* g1, + G1ParScanThreadState* par_scan_state): G1ParClosureSuper(g1, par_scan_state) { } template void do_oop_nv(T* p); @@ -71,9 +97,10 @@ virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; -class G1ParScanClosure : public G1ParClosureSuper { +// This closure is applied to the fields of the objects that have just been copied during evacuation. +class G1ScanEvacuatedObjClosure : public G1ParClosureSuper { public: - G1ParScanClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : + G1ScanEvacuatedObjClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : G1ParClosureSuper(g1, par_scan_state) { } template void do_oop_nv(T* p); @@ -186,42 +213,7 @@ template void do_oop_nv(T* p); virtual void do_oop(narrowOop* p) { do_oop_nv(p); } - virtual void do_oop(oop* p) { do_oop_nv(p); } -}; - -class G1UpdateRSOrPushRefOopClosure: public ExtendedOopClosure { - G1CollectedHeap* _g1; - HeapRegion* _from; - G1ParPushHeapRSClosure* _push_ref_cl; - bool _record_refs_into_cset; - uint _worker_i; - bool _has_refs_into_cset; - -public: - G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h, - G1ParPushHeapRSClosure* push_ref_cl, - bool record_refs_into_cset, - uint worker_i = 0); - - void set_from(HeapRegion* from) { - assert(from != NULL, "from region must be non-NULL"); - _from = from; - } - - bool self_forwarded(oop obj) { - markOop m = obj->mark(); - bool result = (m->is_marked() && ((oop)m->decode_pointer() == obj)); - return result; - } - - bool has_refs_into_cset() const { return _has_refs_into_cset; } - - template inline void do_oop_nv(T* p); - virtual inline void do_oop(narrowOop* p); - virtual inline void do_oop(oop* p); - - // This closure needs special handling for InstanceRefKlass. - virtual ReferenceIterationMode reference_iteration_mode() { return DO_DISCOVERED_AND_DISCOVERY; } + virtual void do_oop(oop* p) { do_oop_nv(p); } }; #endif // SHARE_VM_GC_G1_G1OOPCLOSURES_HPP