--- old/src/share/vm/gc/serial/markSweep.hpp 2016-12-20 16:31:54.021790984 -0500 +++ new/src/share/vm/gc/serial/markSweep.hpp 2016-12-20 16:31:52.841723481 -0500 @@ -39,6 +39,29 @@ class DataLayout; class SerialOldTracer; class STWGCTimer; +class MarkSweep; + +class MarkAndPushClosure: public ExtendedOopClosure { + MarkSweep* _ms; +public: + MarkAndPushClosure(MarkSweep* ms) : _ms(ms) {} + template void do_oop_nv(T* p); + virtual void do_oop(oop* p); + virtual void do_oop(narrowOop* p); + + virtual bool do_metadata(); + bool do_metadata_nv(); + + virtual void do_klass(Klass* k); + void do_klass_nv(Klass* k); + + virtual void do_cld(ClassLoaderData* cld); + void do_cld_nv(ClassLoaderData* cld); + + void set_ref_processor(ReferenceProcessor* rp) { + set_ref_processor_internal(rp); + } +}; // MarkSweep takes care of global mark-compact garbage collection for a // GenCollectedHeap using a four-phase pointer forwarding algorithm. All @@ -49,20 +72,23 @@ // declared at end class PreservedMark; -class MarkAndPushClosure; -class MarkSweep : AllStatic { +class MarkSweep : public StackObj { // // Inline closure decls // class FollowRootClosure: public OopsInGenClosure { + MarkSweep* _ms; public: + FollowRootClosure(MarkSweep* ms) : _ms(ms) {} virtual void do_oop(oop* p); virtual void do_oop(narrowOop* p); }; class FollowStackClosure: public VoidClosure { + MarkSweep* _ms; public: + FollowStackClosure(MarkSweep* ms) : _ms(ms) {} virtual void do_void(); }; @@ -78,14 +104,18 @@ // Used for java/lang/ref handling class IsAliveClosure: public BoolObjectClosure { + MarkSweep* _ms; public: + IsAliveClosure(MarkSweep* ms) : _ms(ms) {} virtual bool do_object_b(oop p); }; class KeepAliveClosure: public OopClosure { + MarkSweep* _ms; protected: template void do_oop_work(T* p); public: + KeepAliveClosure(MarkSweep* ms) : _ms(ms) {} virtual void do_oop(oop* p); virtual void do_oop(narrowOop* p); }; @@ -106,41 +136,47 @@ static uint _total_invocations; // Traversal stacks used during phase1 - static Stack _marking_stack; - static Stack _objarray_stack; + Stack _marking_stack; + Stack _objarray_stack; // Space for storing/restoring mark word - static Stack _preserved_mark_stack; - static Stack _preserved_oop_stack; - static size_t _preserved_count; - static size_t _preserved_count_max; - static PreservedMark* _preserved_marks; + Stack _preserved_mark_stack; + Stack _preserved_oop_stack; + size_t _preserved_count; + size_t _preserved_count_max; + PreservedMark* _preserved_marks; // Reference processing (used in ...follow_contents) - static ReferenceProcessor* _ref_processor; + ReferenceProcessor* _ref_processor; static STWGCTimer* _gc_timer; static SerialOldTracer* _gc_tracer; // Non public closures - static KeepAliveClosure keep_alive; + KeepAliveClosure keep_alive; public: + // Constructor + MarkSweep(); + + // Destructor + ~MarkSweep(); + // Public closures - static IsAliveClosure is_alive; - static FollowRootClosure follow_root_closure; - static MarkAndPushClosure mark_and_push_closure; - static FollowStackClosure follow_stack_closure; - static CLDToOopClosure follow_cld_closure; - static AdjustPointerClosure adjust_pointer_closure; - static CLDToOopClosure adjust_cld_closure; + IsAliveClosure is_alive; + FollowRootClosure follow_root_closure; + MarkAndPushClosure mark_and_push_closure; + FollowStackClosure follow_stack_closure; + CLDToOopClosure follow_cld_closure; + AdjustPointerClosure adjust_pointer_closure; + CLDToOopClosure adjust_cld_closure; // Accessors static uint total_invocations() { return _total_invocations; } // Reference Processing - static ReferenceProcessor* const ref_processor() { return _ref_processor; } - static void set_ref_processor(ReferenceProcessor* rp); + ReferenceProcessor* const ref_processor() { return _ref_processor; } + void set_ref_processor(ReferenceProcessor* rp); // Archive Object handling static inline bool is_archive_object(oop object); @@ -148,57 +184,37 @@ static STWGCTimer* gc_timer() { return _gc_timer; } static SerialOldTracer* gc_tracer() { return _gc_tracer; } - static void preserve_mark(oop p, markOop mark); + void preserve_mark(oop p, markOop mark); // Save the mark word so it can be restored later - static void adjust_marks(); // Adjust the pointers in the preserved marks table - static void restore_marks(); // Restore the marks that we saved in preserve_mark + void adjust_marks(); // Adjust the pointers in the preserved marks table + void restore_marks(); // Restore the marks that we saved in preserve_mark - static int adjust_pointers(oop obj); + int adjust_pointers(oop obj); - static void follow_stack(); // Empty marking stack. + void follow_stack(); // Empty marking stack. - static void follow_klass(Klass* klass); + void follow_klass(Klass* klass); - static void follow_cld(ClassLoaderData* cld); + void follow_cld(ClassLoaderData* cld); template static inline void adjust_pointer(T* p); // Check mark and maybe push on marking stack - template static void mark_and_push(T* p); + template void mark_and_push(T* p); private: // Call backs for marking - static void mark_object(oop obj); + void mark_object(oop obj); // Mark pointer and follow contents. Empty marking stack afterwards. - template static inline void follow_root(T* p); - - static inline void push_objarray(oop obj, size_t index); + template inline void follow_root(T* p); - static void follow_object(oop obj); + inline void push_objarray(oop obj, size_t index); - static void follow_array(objArrayOop array); + void follow_object(oop obj); - static void follow_array_chunk(objArrayOop array, int index); -}; + void follow_array(objArrayOop array); -class MarkAndPushClosure: public ExtendedOopClosure { -public: - template void do_oop_nv(T* p); - virtual void do_oop(oop* p); - virtual void do_oop(narrowOop* p); - - virtual bool do_metadata(); - bool do_metadata_nv(); - - virtual void do_klass(Klass* k); - void do_klass_nv(Klass* k); - - virtual void do_cld(ClassLoaderData* cld); - void do_cld_nv(ClassLoaderData* cld); - - void set_ref_processor(ReferenceProcessor* rp) { - set_ref_processor_internal(rp); - } + void follow_array_chunk(objArrayOop array, int index); }; class PreservedMark VALUE_OBJ_CLASS_SPEC {