comparison src/share/vm/gc_implementation/g1/g1OopClosures.hpp @ 4839:b4ebad3520bb

7133038: G1: Some small profile based optimizations Summary: Some minor profile based optimizations. Reduce the number of branches and branch mispredicts by removing some virtual calls, through closure specalization, and refactoring some conditional statements. Reviewed-by: brutisso, tonyp
author johnc
date Thu, 26 Jan 2012 14:14:55 -0800
parents eff609af17d7
children 748051fd24ce
comparison
equal deleted inserted replaced
4838:a5244e07b761 4839:b4ebad3520bb
244 template <class T> void do_oop_nv(T* p); 244 template <class T> void do_oop_nv(T* p);
245 virtual void do_oop( oop* p) { do_oop_nv(p); } 245 virtual void do_oop( oop* p) { do_oop_nv(p); }
246 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } 246 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
247 }; 247 };
248 248
249 // Closure that applies the given two closures in sequence.
250 // Used by the RSet refinement code (when updating RSets
251 // during an evacuation pause) to record cards containing
252 // pointers into the collection set.
253
254 class G1Mux2Closure : public OopClosure {
255 OopClosure* _c1;
256 OopClosure* _c2;
257 public:
258 G1Mux2Closure(OopClosure *c1, OopClosure *c2);
259 template <class T> void do_oop_nv(T* p);
260 virtual void do_oop(oop* p) { do_oop_nv(p); }
261 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
262 };
263
264 // A closure that returns true if it is actually applied
265 // to a reference
266
267 class G1TriggerClosure : public OopClosure {
268 bool _triggered;
269 public:
270 G1TriggerClosure();
271 bool triggered() const { return _triggered; }
272 template <class T> void do_oop_nv(T* p);
273 virtual void do_oop(oop* p) { do_oop_nv(p); }
274 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
275 };
276
277 // A closure which uses a triggering closure to determine
278 // whether to apply an oop closure.
279
280 class G1InvokeIfNotTriggeredClosure: public OopClosure {
281 G1TriggerClosure* _trigger_cl;
282 OopClosure* _oop_cl;
283 public:
284 G1InvokeIfNotTriggeredClosure(G1TriggerClosure* t, OopClosure* oc);
285 template <class T> void do_oop_nv(T* p);
286 virtual void do_oop(oop* p) { do_oop_nv(p); }
287 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
288 };
289
290 class G1UpdateRSOrPushRefOopClosure: public OopClosure {
291 G1CollectedHeap* _g1;
292 G1RemSet* _g1_rem_set;
293 HeapRegion* _from;
294 OopsInHeapRegionClosure* _push_ref_cl;
295 bool _record_refs_into_cset;
296 int _worker_i;
297
298 public:
299 G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h,
300 G1RemSet* rs,
301 OopsInHeapRegionClosure* push_ref_cl,
302 bool record_refs_into_cset,
303 int worker_i = 0);
304
305 void set_from(HeapRegion* from) {
306 assert(from != NULL, "from region must be non-NULL");
307 _from = from;
308 }
309
310 bool self_forwarded(oop obj) {
311 bool result = (obj->is_forwarded() && (obj->forwardee()== obj));
312 return result;
313 }
314
315 bool apply_to_weak_ref_discovered_field() { return true; }
316
317 template <class T> void do_oop_nv(T* p);
318 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
319 virtual void do_oop(oop* p) { do_oop_nv(p); }
320 };
321
249 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP 322 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP