hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
changeset 25356 4a4a482298a6
parent 25351 7c198a690050
child 25485 9c3d427eed01
equal deleted inserted replaced
25355:29c97629997e 25356:4a4a482298a6
    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(&notOlder);
  3126   KlassToOopClosure klass_closure(&notOlder);
  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(&notOlder);
  3747       KlassToOopClosure klass_closure(&notOlder);
  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 {