# HG changeset patch # User stefank # Date 1429690416 -7200 # Wed Apr 22 10:13:36 2015 +0200 # Node ID 62b161f43c32a02b66fd8f4f2a8f5a3bf58c2cc0 # Parent 0895e2181b99e5e5d716fcb5d3a7afa24c91dfe0 8078345: Move PSParallelCompact::mark_and_push to ParCompactionManager diff --git a/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp b/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp +++ b/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp @@ -57,7 +57,7 @@ ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(which); - PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); + ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm); CLDToOopClosure mark_and_push_from_clds(&mark_and_push_closure, true); MarkingCodeBlobClosure mark_and_push_in_blobs(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations); @@ -85,8 +85,8 @@ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id())); ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(which); - PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); - PSParallelCompact::FollowKlassClosure follow_klass_closure(&mark_and_push_closure); + ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm); + ParCompactionManager::FollowKlassClosure follow_klass_closure(&mark_and_push_closure); switch (_root_type) { case universe: @@ -156,8 +156,8 @@ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id())); ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(which); - PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); - PSParallelCompact::FollowStackClosure follow_stack_closure(cm); + ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm); + ParCompactionManager::FollowStackClosure follow_stack_closure(cm); _rp_task.work(_work_id, *PSParallelCompact::is_alive_closure(), mark_and_push_closure, follow_stack_closure); } @@ -213,7 +213,7 @@ ParCompactionManager* cm = ParCompactionManager::gc_thread_compaction_manager(which); - PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); + ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm); oop obj = NULL; ObjArrayTask task; diff --git a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp +++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp @@ -179,11 +179,11 @@ void InstanceKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) { assert(obj != NULL, "can't follow the content of NULL object"); - PSParallelCompact::follow_klass(cm, this); + cm->follow_klass(this); // Only mark the header and let the scan of the meta-data mark // everything else. - PSParallelCompact::MarkAndPushClosure cl(cm); + ParCompactionManager::MarkAndPushClosure cl(cm); InstanceKlass::oop_oop_iterate_oop_maps(obj, &cl); } @@ -201,9 +201,9 @@ // the call to follow_class_loader is made when the class loader itself // is handled. if (klass->oop_is_instance() && InstanceKlass::cast(klass)->is_anonymous()) { - PSParallelCompact::follow_class_loader(cm, klass->class_loader_data()); + cm->follow_class_loader(klass->class_loader_data()); } else { - PSParallelCompact::follow_klass(cm, klass); + cm->follow_klass(klass); } } else { // If klass is NULL then this a mirror for a primitive type. @@ -212,7 +212,7 @@ assert(java_lang_Class::is_primitive(obj), "Sanity check"); } - PSParallelCompact::MarkAndPushClosure cl(cm); + ParCompactionManager::MarkAndPushClosure cl(cm); oop_oop_iterate_statics(obj, &cl); } @@ -221,7 +221,7 @@ ClassLoaderData * const loader_data = java_lang_ClassLoader::loader_data(obj); if (loader_data != NULL) { - PSParallelCompact::follow_class_loader(cm, loader_data); + cm->follow_class_loader(loader_data); } } @@ -253,7 +253,7 @@ gclog_or_tty->print_cr(" Non NULL normal " PTR_FORMAT, p2i(obj)); } ) - PSParallelCompact::mark_and_push(cm, referent_addr); + cm->mark_and_push(referent_addr); } } T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj); @@ -269,7 +269,7 @@ PTR_FORMAT, p2i(discovered_addr)); } ) - PSParallelCompact::mark_and_push(cm, discovered_addr); + cm->mark_and_push(discovered_addr); } } else { #ifdef ASSERT @@ -283,7 +283,7 @@ p2i(obj))); #endif } - PSParallelCompact::mark_and_push(cm, next_addr); + cm->mark_and_push(next_addr); klass->InstanceKlass::oop_pc_follow_contents(obj, cm); } @@ -297,7 +297,7 @@ } void ObjArrayKlass::oop_pc_follow_contents(oop obj, ParCompactionManager* cm) { - PSParallelCompact::follow_klass(cm, this); + cm->follow_klass(this); if (UseCompressedOops) { oop_pc_follow_contents_specialized(objArrayOop(obj), 0, cm); diff --git a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp +++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp @@ -170,10 +170,17 @@ bool should_copy(); // Save for later processing. Must not fail. - inline void push(oop obj) { _marking_stack.push(obj); } + inline void push(oop obj); inline void push_objarray(oop objarray, size_t index); inline void push_region(size_t index); + // Check mark and maybe push on marking stack. + template inline void mark_and_push(T* p); + + inline void follow_klass(Klass* klass); + + void follow_class_loader(ClassLoaderData* klass); + // Access function for compaction managers static ParCompactionManager* gc_thread_compaction_manager(int index); @@ -200,6 +207,39 @@ void follow_contents(objArrayOop array, int index); void update_contents(oop obj); + + class MarkAndPushClosure: public ExtendedOopClosure { + private: + ParCompactionManager* _compaction_manager; + public: + MarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } + + template void do_oop_nv(T* p); + virtual void do_oop(oop* p); + virtual void do_oop(narrowOop* p); + + // This closure provides its own oop verification code. + debug_only(virtual bool should_verify_oops() { return false; }) + }; + + class FollowStackClosure: public VoidClosure { + private: + ParCompactionManager* _compaction_manager; + public: + FollowStackClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } + virtual void do_void(); + }; + + // The one and only place to start following the classes. + // Should only be applied to the ClassLoaderData klasses list. + class FollowKlassClosure : public KlassClosure { + private: + MarkAndPushClosure* _mark_and_push_closure; + public: + FollowKlassClosure(MarkAndPushClosure* mark_and_push_closure) : + _mark_and_push_closure(mark_and_push_closure) { } + void do_klass(Klass* klass); + }; }; inline ParCompactionManager* ParCompactionManager::manager_array(int index) { diff --git a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.inline.hpp b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.inline.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.inline.hpp +++ b/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.inline.hpp @@ -32,6 +32,10 @@ #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" +inline void ParCompactionManager::push(oop obj) { + _marking_stack.push(obj); +} + void ParCompactionManager::push_objarray(oop obj, size_t index) { ObjArrayTask task(obj, index); @@ -50,6 +54,47 @@ region_stack()->push(index); } +template +inline void ParCompactionManager::mark_and_push(T* p) { + T heap_oop = oopDesc::load_heap_oop(p); + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); + assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap"); + + if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) { + push(obj); + } + } +} + +template +inline void ParCompactionManager::MarkAndPushClosure::do_oop_nv(T* p) { + _compaction_manager->mark_and_push(p); +} + +inline void ParCompactionManager::MarkAndPushClosure::do_oop(oop* p) { do_oop_nv(p); } +inline void ParCompactionManager::MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_nv(p); } + +inline void ParCompactionManager::follow_klass(Klass* klass) { + oop holder = klass->klass_holder(); + mark_and_push(&holder); +} + +inline void ParCompactionManager::FollowStackClosure::do_void() { + _compaction_manager->follow_marking_stacks(); +} + +inline void ParCompactionManager::FollowKlassClosure::do_klass(Klass* klass) { + klass->oops_do(_mark_and_push_closure); +} + +inline void ParCompactionManager::follow_class_loader(ClassLoaderData* cld) { + MarkAndPushClosure mark_and_push_closure(this); + FollowKlassClosure follow_klass_closure(&mark_and_push_closure); + + cld->oops_do(&mark_and_push_closure, &follow_klass_closure, true); +} + inline void ParCompactionManager::follow_contents(oop obj) { assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked"); obj->pc_follow_contents(this); @@ -69,7 +114,7 @@ // Push the non-NULL elements of the next stride on the marking stack. for (T* e = beg; e < end; e++) { - PSParallelCompact::mark_and_push(cm, e); + cm->mark_and_push(e); } if (end_index < len) { diff --git a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -822,11 +822,6 @@ PSParallelCompact::AdjustPointerClosure PSParallelCompact::_adjust_pointer_closure; PSParallelCompact::AdjustKlassClosure PSParallelCompact::_adjust_klass_closure; -void PSParallelCompact::FollowStackClosure::do_void() { _compaction_manager->follow_marking_stacks(); } - -void PSParallelCompact::FollowKlassClosure::do_klass(Klass* klass) { - klass->oops_do(_mark_and_push_closure); -} void PSParallelCompact::AdjustKlassClosure::do_klass(Klass* klass) { klass->oops_do(&PSParallelCompact::_adjust_pointer_closure); } @@ -2346,8 +2341,8 @@ TaskQueueSetSuper* qset = ParCompactionManager::region_array(); ParallelTaskTerminator terminator(active_gc_threads, qset); - PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); - PSParallelCompact::FollowStackClosure follow_stack_closure(cm); + ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm); + ParCompactionManager::FollowStackClosure follow_stack_closure(cm); // Need new claim bits before marking starts. ClassLoaderDataGraph::clear_claimed_marks(); @@ -2421,14 +2416,6 @@ _gc_tracer.report_object_count_after_gc(is_alive_closure()); } -void PSParallelCompact::follow_class_loader(ParCompactionManager* cm, - ClassLoaderData* cld) { - PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm); - PSParallelCompact::FollowKlassClosure follow_klass_closure(&mark_and_push_closure); - - cld->oops_do(&mark_and_push_closure, &follow_klass_closure, true); -} - // This should be moved to the shared markSweep code! class PSAlwaysTrueClosure: public BoolObjectClosure { public: diff --git a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @@ -28,7 +28,6 @@ #include "gc_implementation/parallelScavenge/objectStartArray.hpp" #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" #include "gc_implementation/parallelScavenge/parMarkBitMap.hpp" -#include "gc_implementation/parallelScavenge/psCompactionManager.hpp" #include "gc_implementation/shared/collectorCounters.hpp" #include "gc_implementation/shared/mutableSpace.hpp" #include "gc_interface/collectedHeap.hpp" @@ -933,14 +932,6 @@ virtual bool do_object_b(oop p); }; - class FollowStackClosure: public VoidClosure { - private: - ParCompactionManager* _compaction_manager; - public: - FollowStackClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } - virtual void do_void(); - }; - class AdjustPointerClosure: public ExtendedOopClosure { public: template void do_oop_nv(T* p); @@ -956,11 +947,8 @@ void do_klass(Klass* klass); }; - friend class FollowStackClosure; friend class AdjustPointerClosure; friend class AdjustKlassClosure; - friend class FollowKlassClosure; - friend class InstanceClassLoaderKlass; friend class RefProcTaskProxy; private: @@ -1127,30 +1115,6 @@ static void reset_millis_since_last_gc(); public: - class MarkAndPushClosure: public ExtendedOopClosure { - private: - ParCompactionManager* _compaction_manager; - public: - MarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { } - - template void do_oop_nv(T* p); - virtual void do_oop(oop* p); - virtual void do_oop(narrowOop* p); - - // This closure provides its own oop verification code. - debug_only(virtual bool should_verify_oops() { return false; }) - }; - - // The one and only place to start following the classes. - // Should only be applied to the ClassLoaderData klasses list. - class FollowKlassClosure : public KlassClosure { - private: - MarkAndPushClosure* _mark_and_push_closure; - public: - FollowKlassClosure(MarkAndPushClosure* mark_and_push_closure) : - _mark_and_push_closure(mark_and_push_closure) { } - void do_klass(Klass* klass); - }; PSParallelCompact(); @@ -1182,16 +1146,9 @@ // Marking support static inline bool mark_obj(oop obj); static inline bool is_marked(oop obj); - // Check mark and maybe push on marking stack - template static inline void mark_and_push(ParCompactionManager* cm, - T* p); + template static inline void adjust_pointer(T* p); - static inline void follow_klass(ParCompactionManager* cm, Klass* klass); - - static void follow_class_loader(ParCompactionManager* cm, - ClassLoaderData* klass); - // Compaction support. // Return true if p is in the range [beg_addr, end_addr). static inline bool is_in(HeapWord* p, HeapWord* beg_addr, HeapWord* end_addr); diff --git a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.inline.hpp b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.inline.hpp --- a/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.inline.hpp +++ b/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.inline.hpp @@ -26,38 +26,11 @@ #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPARALLELCOMPACT_INLINE_HPP #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" -#include "gc_implementation/parallelScavenge/psCompactionManager.hpp" #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" #include "gc_interface/collectedHeap.hpp" #include "oops/klass.hpp" #include "oops/oop.inline.hpp" -template -inline void PSParallelCompact::mark_and_push(ParCompactionManager* cm, T* p) { - T heap_oop = oopDesc::load_heap_oop(p); - if (!oopDesc::is_null(heap_oop)) { - oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); - assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap"); - - if (mark_bitmap()->is_unmarked(obj) && mark_obj(obj)) { - cm->push(obj); - } - } -} - -template -inline void PSParallelCompact::MarkAndPushClosure::do_oop_nv(T* p) { - mark_and_push(_compaction_manager, p); -} - -inline void PSParallelCompact::MarkAndPushClosure::do_oop(oop* p) { do_oop_nv(p); } -inline void PSParallelCompact::MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_nv(p); } - -inline void PSParallelCompact::follow_klass(ParCompactionManager* cm, Klass* klass) { - oop holder = klass->klass_holder(); - mark_and_push(cm, &holder); -} - template inline void PSParallelCompact::adjust_pointer(T* p) { T heap_oop = oopDesc::load_heap_oop(p);