comparison src/share/vm/gc_implementation/g1/g1OopClosures.hpp @ 526:818efdefcc99

6484956: G1: improve evacuation pause efficiency Summary: A bunch of performance optimizations to decrease GC pause times in G1. Reviewed-by: apetrusenko, jmasa, iveresov
author tonyp
date Fri, 16 Jan 2009 13:02:20 -0500
parents 37f87013dfd8
children 0fbdb4381b99
comparison
equal deleted inserted replaced
519:65de26b5ea82 526:818efdefcc99
75 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } 75 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
76 }; 76 };
77 77
78 #define G1_PARTIAL_ARRAY_MASK 1 78 #define G1_PARTIAL_ARRAY_MASK 1
79 79
80 inline bool has_partial_array_mask(oop* ref) {
81 return (intptr_t) ref & G1_PARTIAL_ARRAY_MASK;
82 }
83
84 inline oop* set_partial_array_mask(oop obj) {
85 return (oop*) ((intptr_t) obj | G1_PARTIAL_ARRAY_MASK);
86 }
87
88 inline oop clear_partial_array_mask(oop* ref) {
89 return oop((intptr_t) ref & ~G1_PARTIAL_ARRAY_MASK);
90 }
91
80 class G1ParScanPartialArrayClosure : public G1ParClosureSuper { 92 class G1ParScanPartialArrayClosure : public G1ParClosureSuper {
81 G1ParScanClosure _scanner; 93 G1ParScanClosure _scanner;
82 template <class T> void process_array_chunk(oop obj, int start, int end); 94 template <class T> void process_array_chunk(oop obj, int start, int end);
83 public: 95 public:
84 G1ParScanPartialArrayClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : 96 G1ParScanPartialArrayClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) :
99 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, 111 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state,
100 G1ParScanClosure *scanner) : 112 G1ParScanClosure *scanner) :
101 G1ParClosureSuper(g1, par_scan_state), _scanner(scanner) { } 113 G1ParClosureSuper(g1, par_scan_state), _scanner(scanner) { }
102 }; 114 };
103 115
104 template<bool do_gen_barrier, G1Barrier barrier, bool do_mark_forwardee> 116 template<bool do_gen_barrier, G1Barrier barrier,
117 bool do_mark_forwardee, bool skip_cset_test>
105 class G1ParCopyClosure : public G1ParCopyHelper { 118 class G1ParCopyClosure : public G1ParCopyHelper {
106 G1ParScanClosure _scanner; 119 G1ParScanClosure _scanner;
107 void do_oop_work(oop* p); 120 void do_oop_work(oop* p);
108 void do_oop_work(narrowOop* p) { guarantee(false, "NYI"); } 121 void do_oop_work(narrowOop* p) { guarantee(false, "NYI"); }
109 public: 122 public:
117 inline void do_oop_nv(narrowOop* p) { guarantee(false, "NYI"); } 130 inline void do_oop_nv(narrowOop* p) { guarantee(false, "NYI"); }
118 virtual void do_oop(oop* p) { do_oop_nv(p); } 131 virtual void do_oop(oop* p) { do_oop_nv(p); }
119 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } 132 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
120 }; 133 };
121 134
122 typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure; 135 typedef G1ParCopyClosure<false, G1BarrierNone, false, false> G1ParScanExtRootClosure;
123 typedef G1ParCopyClosure<true, G1BarrierNone, false> G1ParScanPermClosure; 136 typedef G1ParCopyClosure<true, G1BarrierNone, false, false> G1ParScanPermClosure;
124 typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure; 137 typedef G1ParCopyClosure<false, G1BarrierNone, true, false> G1ParScanAndMarkExtRootClosure;
125 typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkPermClosure; 138 typedef G1ParCopyClosure<true, G1BarrierNone, true, false> G1ParScanAndMarkPermClosure;
126 typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure; 139 typedef G1ParCopyClosure<false, G1BarrierRS, false, false> G1ParScanHeapRSClosure;
127 typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure; 140 typedef G1ParCopyClosure<false, G1BarrierRS, true, false> G1ParScanAndMarkHeapRSClosure;
128 typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure; 141 // This is the only case when we set skip_cset_test. Basically, this
129 142 // closure is (should?) only be called directly while we're draining
143 // the overflow and task queues. In that case we know that the
144 // reference in question points into the collection set, otherwise we
145 // would not have pushed it on the queue.
146 typedef G1ParCopyClosure<false, G1BarrierEvac, false, true> G1ParScanHeapEvacClosure;
147 // We need a separate closure to handle references during evacuation
148 // failure processing, as it cannot asume that the reference already
149 // points to the collection set (like G1ParScanHeapEvacClosure does).
150 typedef G1ParCopyClosure<false, G1BarrierEvac, false, false> G1ParScanHeapEvacFailureClosure;
130 151
131 class FilterIntoCSClosure: public OopClosure { 152 class FilterIntoCSClosure: public OopClosure {
132 G1CollectedHeap* _g1; 153 G1CollectedHeap* _g1;
133 OopClosure* _oc; 154 OopClosure* _oc;
134 DirtyCardToOopClosure* _dcto_cl; 155 DirtyCardToOopClosure* _dcto_cl;