Mercurial > hg > graal-jvmci-8
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 |