< prev index next >

src/share/vm/gc/g1/g1CollectedHeap.hpp

Print this page
rev 8687 : 8004687: G1: Parallelize object self-forwarding and scanning during an evacuation failure
Summary: Use the regular task queue during evacuation failure and allow per-thread preserved header queues to remove the global lock during evacuation failure.
Reviewed-by:
Contributed-by: Walter Florian Gugenberger <walter.gugenberger@gmail.com>

*** 856,903 **** // Failed evacuations cause some logical from-space objects to have // forwarding pointers to themselves. Reset them. void remove_self_forwarding_pointers(); ! // Together, these store an object with a preserved mark, and its mark value. ! Stack<oop, mtGC> _objs_with_preserved_marks; ! Stack<markOop, mtGC> _preserved_marks_of_objs; ! ! // Preserve the mark of "obj", if necessary, in preparation for its mark ! // word being overwritten with a self-forwarding-pointer. ! void preserve_mark_if_necessary(oop obj, markOop m); ! // The stack of evac-failure objects left to be scanned. ! GrowableArray<oop>* _evac_failure_scan_stack; ! // The closure to apply to evac-failure objects. ! ! OopsInHeapRegionClosure* _evac_failure_closure; ! // Set the field above. ! void ! set_evac_failure_closure(OopsInHeapRegionClosure* evac_failure_closure) { ! _evac_failure_closure = evac_failure_closure; } ! // Push "obj" on the scan stack. ! void push_on_evac_failure_scan_stack(oop obj); ! // Process scan stack entries until the stack is empty. ! void drain_evac_failure_scan_stack(); ! // True iff an invocation of "drain_scan_stack" is in progress; to ! // prevent unnecessary recursion. ! bool _drain_in_progress; ! ! // Do any necessary initialization for evacuation-failure handling. ! // "cl" is the closure that will be used to process evac-failure ! // objects. ! void init_for_evac_failure(OopsInHeapRegionClosure* cl); ! // Do any necessary cleanup for evacuation-failure handling data ! // structures. ! void finalize_for_evac_failure(); ! ! // An attempt to evacuate "obj" has failed; take necessary steps. ! oop handle_evacuation_failure_par(G1ParScanThreadState* _par_scan_state, oop obj); ! void handle_evacuation_failure_common(oop obj, markOop m); #ifndef PRODUCT // Support for forcing evacuation failures. Analogous to // PromotionFailureALot for the other collectors. --- 856,886 ---- // Failed evacuations cause some logical from-space objects to have // forwarding pointers to themselves. Reset them. void remove_self_forwarding_pointers(); ! struct OopAndMarkOop { ! private: ! oop _o; ! markOop _m; ! public: ! OopAndMarkOop(oop obj, markOop m) : _o(obj), _m(m) { ! } ! void set_mark() { ! _o->set_mark(_m); } + }; ! typedef Stack<OopAndMarkOop,mtGC> OopAndMarkOopStack; ! // Stores marks with the corresponding oop that we need to preserve during evacuation ! // failure. ! OopAndMarkOopStack* _preserved_objs; ! ! // Preserve the mark of "obj", if necessary, in preparation for its mark ! // word being overwritten with a self-forwarding-pointer. ! void preserve_mark_during_evac_failure(uint queue, oop obj, markOop m); #ifndef PRODUCT // Support for forcing evacuation failures. Analogous to // PromotionFailureALot for the other collectors.
< prev index next >