hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
equal
deleted
inserted
replaced
47 #include "memory/collectorPolicy.hpp" |
47 #include "memory/collectorPolicy.hpp" |
48 #include "memory/gcLocker.inline.hpp" |
48 #include "memory/gcLocker.inline.hpp" |
49 #include "memory/genCollectedHeap.hpp" |
49 #include "memory/genCollectedHeap.hpp" |
50 #include "memory/genMarkSweep.hpp" |
50 #include "memory/genMarkSweep.hpp" |
51 #include "memory/genOopClosures.inline.hpp" |
51 #include "memory/genOopClosures.inline.hpp" |
52 #include "memory/iterator.hpp" |
52 #include "memory/iterator.inline.hpp" |
53 #include "memory/padded.hpp" |
53 #include "memory/padded.hpp" |
54 #include "memory/referencePolicy.hpp" |
54 #include "memory/referencePolicy.hpp" |
55 #include "memory/resourceArea.hpp" |
55 #include "memory/resourceArea.hpp" |
56 #include "memory/tenuredGeneration.hpp" |
56 #include "memory/tenuredGeneration.hpp" |
57 #include "oops/oop.inline.hpp" |
57 #include "oops/oop.inline.hpp" |
3121 ClassLoaderDataGraph::clear_claimed_marks(); |
3121 ClassLoaderDataGraph::clear_claimed_marks(); |
3122 |
3122 |
3123 // Mark from roots one level into CMS |
3123 // Mark from roots one level into CMS |
3124 MarkRefsIntoVerifyClosure notOlder(_span, verification_mark_bm(), |
3124 MarkRefsIntoVerifyClosure notOlder(_span, verification_mark_bm(), |
3125 markBitMap()); |
3125 markBitMap()); |
3126 CMKlassClosure klass_closure(¬Older); |
3126 KlassToOopClosure klass_closure(¬Older); |
3127 |
3127 |
3128 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. |
3128 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. |
3129 gch->gen_process_strong_roots(_cmsGen->level(), |
3129 gch->gen_process_strong_roots(_cmsGen->level(), |
3130 true, // younger gens are roots |
3130 true, // younger gens are roots |
3131 true, // activate StrongRootsScope |
3131 true, // activate StrongRootsScope |
3742 tsk.work(0); |
3742 tsk.work(0); |
3743 } |
3743 } |
3744 gch->set_par_threads(0); |
3744 gch->set_par_threads(0); |
3745 } else { |
3745 } else { |
3746 // The serial version. |
3746 // The serial version. |
3747 CMKlassClosure klass_closure(¬Older); |
3747 KlassToOopClosure klass_closure(¬Older); |
3748 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. |
3748 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. |
3749 gch->gen_process_strong_roots(_cmsGen->level(), |
3749 gch->gen_process_strong_roots(_cmsGen->level(), |
3750 true, // younger gens are roots |
3750 true, // younger gens are roots |
3751 true, // activate StrongRootsScope |
3751 true, // activate StrongRootsScope |
3752 SharedHeap::ScanningOption(roots_scanning_options()), |
3752 SharedHeap::ScanningOption(roots_scanning_options()), |
4204 // have been bumped up by the thread that claimed the last |
4204 // have been bumped up by the thread that claimed the last |
4205 // task. |
4205 // task. |
4206 pst->all_tasks_completed(); |
4206 pst->all_tasks_completed(); |
4207 } |
4207 } |
4208 |
4208 |
4209 class Par_ConcMarkingClosure: public CMSOopClosure { |
4209 class Par_ConcMarkingClosure: public MetadataAwareOopClosure { |
4210 private: |
4210 private: |
4211 CMSCollector* _collector; |
4211 CMSCollector* _collector; |
4212 CMSConcMarkingTask* _task; |
4212 CMSConcMarkingTask* _task; |
4213 MemRegion _span; |
4213 MemRegion _span; |
4214 CMSBitMap* _bit_map; |
4214 CMSBitMap* _bit_map; |
4217 protected: |
4217 protected: |
4218 DO_OOP_WORK_DEFN |
4218 DO_OOP_WORK_DEFN |
4219 public: |
4219 public: |
4220 Par_ConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue, |
4220 Par_ConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue, |
4221 CMSBitMap* bit_map, CMSMarkStack* overflow_stack): |
4221 CMSBitMap* bit_map, CMSMarkStack* overflow_stack): |
4222 CMSOopClosure(collector->ref_processor()), |
4222 MetadataAwareOopClosure(collector->ref_processor()), |
4223 _collector(collector), |
4223 _collector(collector), |
4224 _task(task), |
4224 _task(task), |
4225 _span(collector->_span), |
4225 _span(collector->_span), |
4226 _work_queue(work_queue), |
4226 _work_queue(work_queue), |
4227 _bit_map(bit_map), |
4227 _bit_map(bit_map), |
4988 verify_overflow_empty(); |
4988 verify_overflow_empty(); |
4989 return cumNumDirtyCards; |
4989 return cumNumDirtyCards; |
4990 } |
4990 } |
4991 |
4991 |
4992 class PrecleanKlassClosure : public KlassClosure { |
4992 class PrecleanKlassClosure : public KlassClosure { |
4993 CMKlassClosure _cm_klass_closure; |
4993 KlassToOopClosure _cm_klass_closure; |
4994 public: |
4994 public: |
4995 PrecleanKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} |
4995 PrecleanKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} |
4996 void do_klass(Klass* k) { |
4996 void do_klass(Klass* k) { |
4997 if (k->has_accumulated_modified_oops()) { |
4997 if (k->has_accumulated_modified_oops()) { |
4998 k->clear_accumulated_modified_oops(); |
4998 k->clear_accumulated_modified_oops(); |
5226 |
5226 |
5227 // ---------- scan from roots -------------- |
5227 // ---------- scan from roots -------------- |
5228 _timer.start(); |
5228 _timer.start(); |
5229 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
5229 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
5230 Par_MarkRefsIntoClosure par_mri_cl(_collector->_span, &(_collector->_markBitMap)); |
5230 Par_MarkRefsIntoClosure par_mri_cl(_collector->_span, &(_collector->_markBitMap)); |
5231 CMKlassClosure klass_closure(&par_mri_cl); |
5231 KlassToOopClosure klass_closure(&par_mri_cl); |
5232 |
5232 |
5233 // ---------- young gen roots -------------- |
5233 // ---------- young gen roots -------------- |
5234 { |
5234 { |
5235 work_on_young_gen_roots(worker_id, &par_mri_cl); |
5235 work_on_young_gen_roots(worker_id, &par_mri_cl); |
5236 _timer.stop(); |
5236 _timer.stop(); |
5300 // ... work stealing for the above |
5300 // ... work stealing for the above |
5301 void do_work_steal(int i, Par_MarkRefsIntoAndScanClosure* cl, int* seed); |
5301 void do_work_steal(int i, Par_MarkRefsIntoAndScanClosure* cl, int* seed); |
5302 }; |
5302 }; |
5303 |
5303 |
5304 class RemarkKlassClosure : public KlassClosure { |
5304 class RemarkKlassClosure : public KlassClosure { |
5305 CMKlassClosure _cm_klass_closure; |
5305 KlassToOopClosure _cm_klass_closure; |
5306 public: |
5306 public: |
5307 RemarkKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} |
5307 RemarkKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} |
5308 void do_klass(Klass* k) { |
5308 void do_klass(Klass* k) { |
5309 // Check if we have modified any oops in the Klass during the concurrent marking. |
5309 // Check if we have modified any oops in the Klass during the concurrent marking. |
5310 if (k->has_accumulated_modified_oops()) { |
5310 if (k->has_accumulated_modified_oops()) { |
7739 |
7739 |
7740 PushAndMarkVerifyClosure::PushAndMarkVerifyClosure( |
7740 PushAndMarkVerifyClosure::PushAndMarkVerifyClosure( |
7741 CMSCollector* collector, MemRegion span, |
7741 CMSCollector* collector, MemRegion span, |
7742 CMSBitMap* verification_bm, CMSBitMap* cms_bm, |
7742 CMSBitMap* verification_bm, CMSBitMap* cms_bm, |
7743 CMSMarkStack* mark_stack): |
7743 CMSMarkStack* mark_stack): |
7744 CMSOopClosure(collector->ref_processor()), |
7744 MetadataAwareOopClosure(collector->ref_processor()), |
7745 _collector(collector), |
7745 _collector(collector), |
7746 _span(span), |
7746 _span(span), |
7747 _verification_bm(verification_bm), |
7747 _verification_bm(verification_bm), |
7748 _cms_bm(cms_bm), |
7748 _cms_bm(cms_bm), |
7749 _mark_stack(mark_stack) |
7749 _mark_stack(mark_stack) |
7792 |
7792 |
7793 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, |
7793 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, |
7794 MemRegion span, |
7794 MemRegion span, |
7795 CMSBitMap* bitMap, CMSMarkStack* markStack, |
7795 CMSBitMap* bitMap, CMSMarkStack* markStack, |
7796 HeapWord* finger, MarkFromRootsClosure* parent) : |
7796 HeapWord* finger, MarkFromRootsClosure* parent) : |
7797 CMSOopClosure(collector->ref_processor()), |
7797 MetadataAwareOopClosure(collector->ref_processor()), |
7798 _collector(collector), |
7798 _collector(collector), |
7799 _span(span), |
7799 _span(span), |
7800 _bitMap(bitMap), |
7800 _bitMap(bitMap), |
7801 _markStack(markStack), |
7801 _markStack(markStack), |
7802 _finger(finger), |
7802 _finger(finger), |
7809 OopTaskQueue* work_queue, |
7809 OopTaskQueue* work_queue, |
7810 CMSMarkStack* overflow_stack, |
7810 CMSMarkStack* overflow_stack, |
7811 HeapWord* finger, |
7811 HeapWord* finger, |
7812 HeapWord** global_finger_addr, |
7812 HeapWord** global_finger_addr, |
7813 Par_MarkFromRootsClosure* parent) : |
7813 Par_MarkFromRootsClosure* parent) : |
7814 CMSOopClosure(collector->ref_processor()), |
7814 MetadataAwareOopClosure(collector->ref_processor()), |
7815 _collector(collector), |
7815 _collector(collector), |
7816 _whole_span(collector->_span), |
7816 _whole_span(collector->_span), |
7817 _span(span), |
7817 _span(span), |
7818 _bit_map(bit_map), |
7818 _bit_map(bit_map), |
7819 _work_queue(work_queue), |
7819 _work_queue(work_queue), |
7856 // Remember the least grey address discarded |
7856 // Remember the least grey address discarded |
7857 HeapWord* ra = (HeapWord*)_overflow_stack->least_value(lost); |
7857 HeapWord* ra = (HeapWord*)_overflow_stack->least_value(lost); |
7858 _collector->lower_restart_addr(ra); |
7858 _collector->lower_restart_addr(ra); |
7859 _overflow_stack->reset(); // discard stack contents |
7859 _overflow_stack->reset(); // discard stack contents |
7860 _overflow_stack->expand(); // expand the stack if possible |
7860 _overflow_stack->expand(); // expand the stack if possible |
7861 } |
|
7862 |
|
7863 void CMKlassClosure::do_klass(Klass* k) { |
|
7864 assert(_oop_closure != NULL, "Not initialized?"); |
|
7865 k->oops_do(_oop_closure); |
|
7866 } |
7861 } |
7867 |
7862 |
7868 void PushOrMarkClosure::do_oop(oop obj) { |
7863 void PushOrMarkClosure::do_oop(oop obj) { |
7869 // Ignore mark word because we are running concurrent with mutators. |
7864 // Ignore mark word because we are running concurrent with mutators. |
7870 assert(obj->is_oop_or_null(true), "expected an oop or NULL"); |
7865 assert(obj->is_oop_or_null(true), "expected an oop or NULL"); |
7960 ReferenceProcessor* rp, |
7955 ReferenceProcessor* rp, |
7961 CMSBitMap* bit_map, |
7956 CMSBitMap* bit_map, |
7962 CMSBitMap* mod_union_table, |
7957 CMSBitMap* mod_union_table, |
7963 CMSMarkStack* mark_stack, |
7958 CMSMarkStack* mark_stack, |
7964 bool concurrent_precleaning): |
7959 bool concurrent_precleaning): |
7965 CMSOopClosure(rp), |
7960 MetadataAwareOopClosure(rp), |
7966 _collector(collector), |
7961 _collector(collector), |
7967 _span(span), |
7962 _span(span), |
7968 _bit_map(bit_map), |
7963 _bit_map(bit_map), |
7969 _mod_union_table(mod_union_table), |
7964 _mod_union_table(mod_union_table), |
7970 _mark_stack(mark_stack), |
7965 _mark_stack(mark_stack), |
8033 Par_PushAndMarkClosure::Par_PushAndMarkClosure(CMSCollector* collector, |
8028 Par_PushAndMarkClosure::Par_PushAndMarkClosure(CMSCollector* collector, |
8034 MemRegion span, |
8029 MemRegion span, |
8035 ReferenceProcessor* rp, |
8030 ReferenceProcessor* rp, |
8036 CMSBitMap* bit_map, |
8031 CMSBitMap* bit_map, |
8037 OopTaskQueue* work_queue): |
8032 OopTaskQueue* work_queue): |
8038 CMSOopClosure(rp), |
8033 MetadataAwareOopClosure(rp), |
8039 _collector(collector), |
8034 _collector(collector), |
8040 _span(span), |
8035 _span(span), |
8041 _bit_map(bit_map), |
8036 _bit_map(bit_map), |
8042 _work_queue(work_queue) |
8037 _work_queue(work_queue) |
8043 { |
8038 { |