Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @ 20268:4c1b88a53c74
8046670: Make CMS metadata aware closures applicable for other collectors
Reviewed-by: ehelin, mgerdin
author | stefank |
---|---|
date | Tue, 24 Jun 2014 16:20:15 +0200 |
parents | 30c99d8e0f02 |
children | 2c6ef90f030a |
comparison
equal
deleted
inserted
replaced
20267:ff1e37e7eb83 | 20268:4c1b88a53c74 |
---|---|
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" |
3096 ClassLoaderDataGraph::clear_claimed_marks(); | 3096 ClassLoaderDataGraph::clear_claimed_marks(); |
3097 | 3097 |
3098 // Mark from roots one level into CMS | 3098 // Mark from roots one level into CMS |
3099 MarkRefsIntoVerifyClosure notOlder(_span, verification_mark_bm(), | 3099 MarkRefsIntoVerifyClosure notOlder(_span, verification_mark_bm(), |
3100 markBitMap()); | 3100 markBitMap()); |
3101 CMKlassClosure klass_closure(¬Older); | 3101 KlassToOopClosure klass_closure(¬Older); |
3102 | 3102 |
3103 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. | 3103 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. |
3104 gch->gen_process_strong_roots(_cmsGen->level(), | 3104 gch->gen_process_strong_roots(_cmsGen->level(), |
3105 true, // younger gens are roots | 3105 true, // younger gens are roots |
3106 true, // activate StrongRootsScope | 3106 true, // activate StrongRootsScope |
3717 tsk.work(0); | 3717 tsk.work(0); |
3718 } | 3718 } |
3719 gch->set_par_threads(0); | 3719 gch->set_par_threads(0); |
3720 } else { | 3720 } else { |
3721 // The serial version. | 3721 // The serial version. |
3722 CMKlassClosure klass_closure(¬Older); | 3722 KlassToOopClosure klass_closure(¬Older); |
3723 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. | 3723 gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel. |
3724 gch->gen_process_strong_roots(_cmsGen->level(), | 3724 gch->gen_process_strong_roots(_cmsGen->level(), |
3725 true, // younger gens are roots | 3725 true, // younger gens are roots |
3726 true, // activate StrongRootsScope | 3726 true, // activate StrongRootsScope |
3727 SharedHeap::ScanningOption(roots_scanning_options()), | 3727 SharedHeap::ScanningOption(roots_scanning_options()), |
4179 // have been bumped up by the thread that claimed the last | 4179 // have been bumped up by the thread that claimed the last |
4180 // task. | 4180 // task. |
4181 pst->all_tasks_completed(); | 4181 pst->all_tasks_completed(); |
4182 } | 4182 } |
4183 | 4183 |
4184 class Par_ConcMarkingClosure: public CMSOopClosure { | 4184 class Par_ConcMarkingClosure: public MetadataAwareOopClosure { |
4185 private: | 4185 private: |
4186 CMSCollector* _collector; | 4186 CMSCollector* _collector; |
4187 CMSConcMarkingTask* _task; | 4187 CMSConcMarkingTask* _task; |
4188 MemRegion _span; | 4188 MemRegion _span; |
4189 CMSBitMap* _bit_map; | 4189 CMSBitMap* _bit_map; |
4192 protected: | 4192 protected: |
4193 DO_OOP_WORK_DEFN | 4193 DO_OOP_WORK_DEFN |
4194 public: | 4194 public: |
4195 Par_ConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue, | 4195 Par_ConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue, |
4196 CMSBitMap* bit_map, CMSMarkStack* overflow_stack): | 4196 CMSBitMap* bit_map, CMSMarkStack* overflow_stack): |
4197 CMSOopClosure(collector->ref_processor()), | 4197 MetadataAwareOopClosure(collector->ref_processor()), |
4198 _collector(collector), | 4198 _collector(collector), |
4199 _task(task), | 4199 _task(task), |
4200 _span(collector->_span), | 4200 _span(collector->_span), |
4201 _work_queue(work_queue), | 4201 _work_queue(work_queue), |
4202 _bit_map(bit_map), | 4202 _bit_map(bit_map), |
4963 verify_overflow_empty(); | 4963 verify_overflow_empty(); |
4964 return cumNumDirtyCards; | 4964 return cumNumDirtyCards; |
4965 } | 4965 } |
4966 | 4966 |
4967 class PrecleanKlassClosure : public KlassClosure { | 4967 class PrecleanKlassClosure : public KlassClosure { |
4968 CMKlassClosure _cm_klass_closure; | 4968 KlassToOopClosure _cm_klass_closure; |
4969 public: | 4969 public: |
4970 PrecleanKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} | 4970 PrecleanKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} |
4971 void do_klass(Klass* k) { | 4971 void do_klass(Klass* k) { |
4972 if (k->has_accumulated_modified_oops()) { | 4972 if (k->has_accumulated_modified_oops()) { |
4973 k->clear_accumulated_modified_oops(); | 4973 k->clear_accumulated_modified_oops(); |
5201 | 5201 |
5202 // ---------- scan from roots -------------- | 5202 // ---------- scan from roots -------------- |
5203 _timer.start(); | 5203 _timer.start(); |
5204 GenCollectedHeap* gch = GenCollectedHeap::heap(); | 5204 GenCollectedHeap* gch = GenCollectedHeap::heap(); |
5205 Par_MarkRefsIntoClosure par_mri_cl(_collector->_span, &(_collector->_markBitMap)); | 5205 Par_MarkRefsIntoClosure par_mri_cl(_collector->_span, &(_collector->_markBitMap)); |
5206 CMKlassClosure klass_closure(&par_mri_cl); | 5206 KlassToOopClosure klass_closure(&par_mri_cl); |
5207 | 5207 |
5208 // ---------- young gen roots -------------- | 5208 // ---------- young gen roots -------------- |
5209 { | 5209 { |
5210 work_on_young_gen_roots(worker_id, &par_mri_cl); | 5210 work_on_young_gen_roots(worker_id, &par_mri_cl); |
5211 _timer.stop(); | 5211 _timer.stop(); |
5275 // ... work stealing for the above | 5275 // ... work stealing for the above |
5276 void do_work_steal(int i, Par_MarkRefsIntoAndScanClosure* cl, int* seed); | 5276 void do_work_steal(int i, Par_MarkRefsIntoAndScanClosure* cl, int* seed); |
5277 }; | 5277 }; |
5278 | 5278 |
5279 class RemarkKlassClosure : public KlassClosure { | 5279 class RemarkKlassClosure : public KlassClosure { |
5280 CMKlassClosure _cm_klass_closure; | 5280 KlassToOopClosure _cm_klass_closure; |
5281 public: | 5281 public: |
5282 RemarkKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} | 5282 RemarkKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {} |
5283 void do_klass(Klass* k) { | 5283 void do_klass(Klass* k) { |
5284 // Check if we have modified any oops in the Klass during the concurrent marking. | 5284 // Check if we have modified any oops in the Klass during the concurrent marking. |
5285 if (k->has_accumulated_modified_oops()) { | 5285 if (k->has_accumulated_modified_oops()) { |
7714 | 7714 |
7715 PushAndMarkVerifyClosure::PushAndMarkVerifyClosure( | 7715 PushAndMarkVerifyClosure::PushAndMarkVerifyClosure( |
7716 CMSCollector* collector, MemRegion span, | 7716 CMSCollector* collector, MemRegion span, |
7717 CMSBitMap* verification_bm, CMSBitMap* cms_bm, | 7717 CMSBitMap* verification_bm, CMSBitMap* cms_bm, |
7718 CMSMarkStack* mark_stack): | 7718 CMSMarkStack* mark_stack): |
7719 CMSOopClosure(collector->ref_processor()), | 7719 MetadataAwareOopClosure(collector->ref_processor()), |
7720 _collector(collector), | 7720 _collector(collector), |
7721 _span(span), | 7721 _span(span), |
7722 _verification_bm(verification_bm), | 7722 _verification_bm(verification_bm), |
7723 _cms_bm(cms_bm), | 7723 _cms_bm(cms_bm), |
7724 _mark_stack(mark_stack) | 7724 _mark_stack(mark_stack) |
7767 | 7767 |
7768 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, | 7768 PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector, |
7769 MemRegion span, | 7769 MemRegion span, |
7770 CMSBitMap* bitMap, CMSMarkStack* markStack, | 7770 CMSBitMap* bitMap, CMSMarkStack* markStack, |
7771 HeapWord* finger, MarkFromRootsClosure* parent) : | 7771 HeapWord* finger, MarkFromRootsClosure* parent) : |
7772 CMSOopClosure(collector->ref_processor()), | 7772 MetadataAwareOopClosure(collector->ref_processor()), |
7773 _collector(collector), | 7773 _collector(collector), |
7774 _span(span), | 7774 _span(span), |
7775 _bitMap(bitMap), | 7775 _bitMap(bitMap), |
7776 _markStack(markStack), | 7776 _markStack(markStack), |
7777 _finger(finger), | 7777 _finger(finger), |
7784 OopTaskQueue* work_queue, | 7784 OopTaskQueue* work_queue, |
7785 CMSMarkStack* overflow_stack, | 7785 CMSMarkStack* overflow_stack, |
7786 HeapWord* finger, | 7786 HeapWord* finger, |
7787 HeapWord** global_finger_addr, | 7787 HeapWord** global_finger_addr, |
7788 Par_MarkFromRootsClosure* parent) : | 7788 Par_MarkFromRootsClosure* parent) : |
7789 CMSOopClosure(collector->ref_processor()), | 7789 MetadataAwareOopClosure(collector->ref_processor()), |
7790 _collector(collector), | 7790 _collector(collector), |
7791 _whole_span(collector->_span), | 7791 _whole_span(collector->_span), |
7792 _span(span), | 7792 _span(span), |
7793 _bit_map(bit_map), | 7793 _bit_map(bit_map), |
7794 _work_queue(work_queue), | 7794 _work_queue(work_queue), |
7831 // Remember the least grey address discarded | 7831 // Remember the least grey address discarded |
7832 HeapWord* ra = (HeapWord*)_overflow_stack->least_value(lost); | 7832 HeapWord* ra = (HeapWord*)_overflow_stack->least_value(lost); |
7833 _collector->lower_restart_addr(ra); | 7833 _collector->lower_restart_addr(ra); |
7834 _overflow_stack->reset(); // discard stack contents | 7834 _overflow_stack->reset(); // discard stack contents |
7835 _overflow_stack->expand(); // expand the stack if possible | 7835 _overflow_stack->expand(); // expand the stack if possible |
7836 } | |
7837 | |
7838 void CMKlassClosure::do_klass(Klass* k) { | |
7839 assert(_oop_closure != NULL, "Not initialized?"); | |
7840 k->oops_do(_oop_closure); | |
7841 } | 7836 } |
7842 | 7837 |
7843 void PushOrMarkClosure::do_oop(oop obj) { | 7838 void PushOrMarkClosure::do_oop(oop obj) { |
7844 // Ignore mark word because we are running concurrent with mutators. | 7839 // Ignore mark word because we are running concurrent with mutators. |
7845 assert(obj->is_oop_or_null(true), "expected an oop or NULL"); | 7840 assert(obj->is_oop_or_null(true), "expected an oop or NULL"); |
7935 ReferenceProcessor* rp, | 7930 ReferenceProcessor* rp, |
7936 CMSBitMap* bit_map, | 7931 CMSBitMap* bit_map, |
7937 CMSBitMap* mod_union_table, | 7932 CMSBitMap* mod_union_table, |
7938 CMSMarkStack* mark_stack, | 7933 CMSMarkStack* mark_stack, |
7939 bool concurrent_precleaning): | 7934 bool concurrent_precleaning): |
7940 CMSOopClosure(rp), | 7935 MetadataAwareOopClosure(rp), |
7941 _collector(collector), | 7936 _collector(collector), |
7942 _span(span), | 7937 _span(span), |
7943 _bit_map(bit_map), | 7938 _bit_map(bit_map), |
7944 _mod_union_table(mod_union_table), | 7939 _mod_union_table(mod_union_table), |
7945 _mark_stack(mark_stack), | 7940 _mark_stack(mark_stack), |
8008 Par_PushAndMarkClosure::Par_PushAndMarkClosure(CMSCollector* collector, | 8003 Par_PushAndMarkClosure::Par_PushAndMarkClosure(CMSCollector* collector, |
8009 MemRegion span, | 8004 MemRegion span, |
8010 ReferenceProcessor* rp, | 8005 ReferenceProcessor* rp, |
8011 CMSBitMap* bit_map, | 8006 CMSBitMap* bit_map, |
8012 OopTaskQueue* work_queue): | 8007 OopTaskQueue* work_queue): |
8013 CMSOopClosure(rp), | 8008 MetadataAwareOopClosure(rp), |
8014 _collector(collector), | 8009 _collector(collector), |
8015 _span(span), | 8010 _span(span), |
8016 _bit_map(bit_map), | 8011 _bit_map(bit_map), |
8017 _work_queue(work_queue) | 8012 _work_queue(work_queue) |
8018 { | 8013 { |