src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp
changeset 51332 c25572739e7c
parent 51292 0538a5cdb474
child 51598 c88019b32bc4
equal deleted inserted replaced
51331:7939b3c4e408 51332:c25572739e7c
   447 bool CMSCollector::_foregroundGCShouldWait = false;
   447 bool CMSCollector::_foregroundGCShouldWait = false;
   448 
   448 
   449 CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
   449 CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
   450                            CardTableRS*                   ct,
   450                            CardTableRS*                   ct,
   451                            ConcurrentMarkSweepPolicy*     cp):
   451                            ConcurrentMarkSweepPolicy*     cp):
       
   452   _overflow_list(NULL),
       
   453   _conc_workers(NULL),     // may be set later
       
   454   _completed_initialization(false),
       
   455   _collection_count_start(0),
       
   456   _should_unload_classes(CMSClassUnloadingEnabled),
       
   457   _concurrent_cycles_since_last_unload(0),
       
   458   _roots_scanning_options(GenCollectedHeap::SO_None),
       
   459   _verification_mark_bm(0, Mutex::leaf + 1, "CMS_verification_mark_bm_lock"),
       
   460   _verifying(false),
       
   461   _collector_policy(cp),
       
   462   _inter_sweep_estimate(CMS_SweepWeight, CMS_SweepPadding),
       
   463   _intra_sweep_estimate(CMS_SweepWeight, CMS_SweepPadding),
       
   464   _gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) CMSTracer()),
       
   465   _gc_timer_cm(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()),
       
   466   _cms_start_registered(false),
   452   _cmsGen(cmsGen),
   467   _cmsGen(cmsGen),
   453   // Adjust span to cover old (cms) gen
   468   // Adjust span to cover old (cms) gen
   454   _span(cmsGen->reserved()),
   469   _span(cmsGen->reserved()),
   455   _ct(ct),
   470   _ct(ct),
   456   _span_based_discoverer(_span),
       
   457   _ref_processor(NULL),    // will be set later
       
   458   _conc_workers(NULL),     // may be set later
       
   459   _abort_preclean(false),
       
   460   _start_sampling(false),
       
   461   _between_prologue_and_epilogue(false),
       
   462   _markBitMap(0, Mutex::leaf + 1, "CMS_markBitMap_lock"),
   471   _markBitMap(0, Mutex::leaf + 1, "CMS_markBitMap_lock"),
   463   _modUnionTable((CardTable::card_shift - LogHeapWordSize),
   472   _modUnionTable((CardTable::card_shift - LogHeapWordSize),
   464                  -1 /* lock-free */, "No_lock" /* dummy */),
   473                  -1 /* lock-free */, "No_lock" /* dummy */),
   465   _modUnionClosurePar(&_modUnionTable),
   474   _restart_addr(NULL),
       
   475   _ser_pmc_preclean_ovflw(0),
       
   476   _ser_pmc_remark_ovflw(0),
       
   477   _par_pmc_remark_ovflw(0),
       
   478   _ser_kac_preclean_ovflw(0),
       
   479   _ser_kac_ovflw(0),
       
   480   _par_kac_ovflw(0),
       
   481 #ifndef PRODUCT
       
   482   _num_par_pushes(0),
       
   483 #endif
       
   484   _span_based_discoverer(_span),
       
   485   _ref_processor(NULL),    // will be set later
   466   // Construct the is_alive_closure with _span & markBitMap
   486   // Construct the is_alive_closure with _span & markBitMap
   467   _is_alive_closure(_span, &_markBitMap),
   487   _is_alive_closure(_span, &_markBitMap),
   468   _restart_addr(NULL),
   488   _modUnionClosurePar(&_modUnionTable),
   469   _overflow_list(NULL),
   489   _between_prologue_and_epilogue(false),
       
   490   _abort_preclean(false),
       
   491   _start_sampling(false),
   470   _stats(cmsGen),
   492   _stats(cmsGen),
   471   _eden_chunk_lock(new Mutex(Mutex::leaf + 1, "CMS_eden_chunk_lock", true,
   493   _eden_chunk_lock(new Mutex(Mutex::leaf + 1, "CMS_eden_chunk_lock", true,
   472                              //verify that this lock should be acquired with safepoint check.
   494                              //verify that this lock should be acquired with safepoint check.
   473                              Monitor::_safepoint_check_sometimes)),
   495                              Monitor::_safepoint_check_sometimes)),
   474   _eden_chunk_array(NULL),     // may be set in ctor body
   496   _eden_chunk_array(NULL),     // may be set in ctor body
       
   497   _eden_chunk_index(0),        // -- ditto --
   475   _eden_chunk_capacity(0),     // -- ditto --
   498   _eden_chunk_capacity(0),     // -- ditto --
   476   _eden_chunk_index(0),        // -- ditto --
       
   477   _survivor_plab_array(NULL),  // -- ditto --
       
   478   _survivor_chunk_array(NULL), // -- ditto --
   499   _survivor_chunk_array(NULL), // -- ditto --
       
   500   _survivor_chunk_index(0),    // -- ditto --
   479   _survivor_chunk_capacity(0), // -- ditto --
   501   _survivor_chunk_capacity(0), // -- ditto --
   480   _survivor_chunk_index(0),    // -- ditto --
   502   _survivor_plab_array(NULL)   // -- ditto --
   481   _ser_pmc_preclean_ovflw(0),
       
   482   _ser_kac_preclean_ovflw(0),
       
   483   _ser_pmc_remark_ovflw(0),
       
   484   _par_pmc_remark_ovflw(0),
       
   485   _ser_kac_ovflw(0),
       
   486   _par_kac_ovflw(0),
       
   487 #ifndef PRODUCT
       
   488   _num_par_pushes(0),
       
   489 #endif
       
   490   _collection_count_start(0),
       
   491   _verifying(false),
       
   492   _verification_mark_bm(0, Mutex::leaf + 1, "CMS_verification_mark_bm_lock"),
       
   493   _completed_initialization(false),
       
   494   _collector_policy(cp),
       
   495   _should_unload_classes(CMSClassUnloadingEnabled),
       
   496   _concurrent_cycles_since_last_unload(0),
       
   497   _roots_scanning_options(GenCollectedHeap::SO_None),
       
   498   _inter_sweep_estimate(CMS_SweepWeight, CMS_SweepPadding),
       
   499   _intra_sweep_estimate(CMS_SweepWeight, CMS_SweepPadding),
       
   500   _gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) CMSTracer()),
       
   501   _gc_timer_cm(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()),
       
   502   _cms_start_registered(false)
       
   503 {
   503 {
   504   // Now expand the span and allocate the collection support structures
   504   // Now expand the span and allocate the collection support structures
   505   // (MUT, marking bit map etc.) to cover both generations subject to
   505   // (MUT, marking bit map etc.) to cover both generations subject to
   506   // collection.
   506   // collection.
   507 
   507 
  3035                  CompactibleFreeListSpace* cms_space,
  3035                  CompactibleFreeListSpace* cms_space,
  3036                  YieldingFlexibleWorkGang* workers,
  3036                  YieldingFlexibleWorkGang* workers,
  3037                  OopTaskQueueSet* task_queues):
  3037                  OopTaskQueueSet* task_queues):
  3038     YieldingFlexibleGangTask("Concurrent marking done multi-threaded"),
  3038     YieldingFlexibleGangTask("Concurrent marking done multi-threaded"),
  3039     _collector(collector),
  3039     _collector(collector),
       
  3040     _n_workers(0),
       
  3041     _result(true),
  3040     _cms_space(cms_space),
  3042     _cms_space(cms_space),
  3041     _n_workers(0), _result(true),
  3043     _bit_map_lock(collector->bitMapLock()),
  3042     _task_queues(task_queues),
  3044     _task_queues(task_queues),
  3043     _term(_n_workers, task_queues, _collector),
  3045     _term(_n_workers, task_queues, _collector)
  3044     _bit_map_lock(collector->bitMapLock())
       
  3045   {
  3046   {
  3046     _requested_size = _n_workers;
  3047     _requested_size = _n_workers;
  3047     _term.set_task(this);
  3048     _term.set_task(this);
  3048     _term_term.set_task(this);
  3049     _term_term.set_task(this);
  3049     _restart_addr = _global_finger = _cms_space->bottom();
  3050     _restart_addr = _global_finger = _cms_space->bottom();
  3318                         CMSBitMap* bit_map, CMSMarkStack* overflow_stack):
  3319                         CMSBitMap* bit_map, CMSMarkStack* overflow_stack):
  3319     MetadataVisitingOopIterateClosure(collector->ref_processor()),
  3320     MetadataVisitingOopIterateClosure(collector->ref_processor()),
  3320     _collector(collector),
  3321     _collector(collector),
  3321     _task(task),
  3322     _task(task),
  3322     _span(collector->_span),
  3323     _span(collector->_span),
  3323     _work_queue(work_queue),
       
  3324     _bit_map(bit_map),
  3324     _bit_map(bit_map),
  3325     _overflow_stack(overflow_stack)
  3325     _overflow_stack(overflow_stack),
       
  3326     _work_queue(work_queue)
  3326   { }
  3327   { }
  3327   virtual void do_oop(oop* p);
  3328   virtual void do_oop(oop* p);
  3328   virtual void do_oop(narrowOop* p);
  3329   virtual void do_oop(narrowOop* p);
  3329 
  3330 
  3330   void trim_queue(size_t max);
  3331   void trim_queue(size_t max);
  5022                       AbstractWorkGang* workers,
  5023                       AbstractWorkGang* workers,
  5023                       OopTaskQueueSet* task_queues):
  5024                       OopTaskQueueSet* task_queues):
  5024     AbstractGangTaskWOopQueues("Process referents by policy in parallel",
  5025     AbstractGangTaskWOopQueues("Process referents by policy in parallel",
  5025       task_queues,
  5026       task_queues,
  5026       workers->active_workers()),
  5027       workers->active_workers()),
  5027     _task(task),
  5028     _collector(collector),
  5028     _collector(collector), _span(span), _mark_bit_map(mark_bit_map)
  5029     _mark_bit_map(mark_bit_map),
       
  5030     _span(span),
       
  5031     _task(task)
  5029   {
  5032   {
  5030     assert(_collector->_span.equals(_span) && !_span.is_empty(),
  5033     assert(_collector->_span.equals(_span) && !_span.is_empty(),
  5031            "Inconsistency in _span");
  5034            "Inconsistency in _span");
  5032   }
  5035   }
  5033 
  5036 
  5062 }
  5065 }
  5063 
  5066 
  5064 CMSParKeepAliveClosure::CMSParKeepAliveClosure(CMSCollector* collector,
  5067 CMSParKeepAliveClosure::CMSParKeepAliveClosure(CMSCollector* collector,
  5065   MemRegion span, CMSBitMap* bit_map, OopTaskQueue* work_queue):
  5068   MemRegion span, CMSBitMap* bit_map, OopTaskQueue* work_queue):
  5066    _span(span),
  5069    _span(span),
       
  5070    _work_queue(work_queue),
  5067    _bit_map(bit_map),
  5071    _bit_map(bit_map),
  5068    _work_queue(work_queue),
       
  5069    _mark_and_push(collector, span, bit_map, work_queue),
  5072    _mark_and_push(collector, span, bit_map, work_queue),
  5070    _low_water_mark(MIN2((work_queue->max_elems()/4),
  5073    _low_water_mark(MIN2((work_queue->max_elems()/4),
  5071                         ((uint)CMSWorkQueueDrainThreshold * ParallelGCThreads)))
  5074                         ((uint)CMSWorkQueueDrainThreshold * ParallelGCThreads)))
  5072 { }
  5075 { }
  5073 
  5076 
  5600 
  5603 
  5601 // Construct a CMS bit map infrastructure, but don't create the
  5604 // Construct a CMS bit map infrastructure, but don't create the
  5602 // bit vector itself. That is done by a separate call CMSBitMap::allocate()
  5605 // bit vector itself. That is done by a separate call CMSBitMap::allocate()
  5603 // further below.
  5606 // further below.
  5604 CMSBitMap::CMSBitMap(int shifter, int mutex_rank, const char* mutex_name):
  5607 CMSBitMap::CMSBitMap(int shifter, int mutex_rank, const char* mutex_name):
       
  5608   _shifter(shifter),
  5605   _bm(),
  5609   _bm(),
  5606   _shifter(shifter),
       
  5607   _lock(mutex_rank >= 0 ? new Mutex(mutex_rank, mutex_name, true,
  5610   _lock(mutex_rank >= 0 ? new Mutex(mutex_rank, mutex_name, true,
  5608                                     Monitor::_safepoint_check_sometimes) : NULL)
  5611                                     Monitor::_safepoint_check_sometimes) : NULL)
  5609 {
  5612 {
  5610   _bmStartWord = 0;
  5613   _bmStartWord = 0;
  5611   _bmWordSize  = 0;
  5614   _bmWordSize  = 0;
  5850                                                        CMSBitMap* mod_union_table,
  5853                                                        CMSBitMap* mod_union_table,
  5851                                                        CMSMarkStack*  mark_stack,
  5854                                                        CMSMarkStack*  mark_stack,
  5852                                                        CMSCollector* collector,
  5855                                                        CMSCollector* collector,
  5853                                                        bool should_yield,
  5856                                                        bool should_yield,
  5854                                                        bool concurrent_precleaning):
  5857                                                        bool concurrent_precleaning):
  5855   _collector(collector),
       
  5856   _span(span),
  5858   _span(span),
  5857   _bit_map(bit_map),
  5859   _bit_map(bit_map),
  5858   _mark_stack(mark_stack),
  5860   _mark_stack(mark_stack),
  5859   _pushAndMarkClosure(collector, span, rd, bit_map, mod_union_table,
  5861   _pushAndMarkClosure(collector, span, rd, bit_map, mod_union_table,
  5860                       mark_stack, concurrent_precleaning),
  5862                       mark_stack, concurrent_precleaning),
       
  5863   _collector(collector),
       
  5864   _freelistLock(NULL),
  5861   _yield(should_yield),
  5865   _yield(should_yield),
  5862   _concurrent_precleaning(concurrent_precleaning),
  5866   _concurrent_precleaning(concurrent_precleaning)
  5863   _freelistLock(NULL)
       
  5864 {
  5867 {
  5865   // FIXME: Should initialize in base class constructor.
  5868   // FIXME: Should initialize in base class constructor.
  5866   assert(rd != NULL, "ref_discoverer shouldn't be NULL");
  5869   assert(rd != NULL, "ref_discoverer shouldn't be NULL");
  5867   set_ref_discoverer_internal(rd);
  5870   set_ref_discoverer_internal(rd);
  5868 }
  5871 }
  6955   _g(g),
  6958   _g(g),
  6956   _sp(g->cmsSpace()),
  6959   _sp(g->cmsSpace()),
  6957   _limit(_sp->sweep_limit()),
  6960   _limit(_sp->sweep_limit()),
  6958   _freelistLock(_sp->freelistLock()),
  6961   _freelistLock(_sp->freelistLock()),
  6959   _bitMap(bitMap),
  6962   _bitMap(bitMap),
  6960   _yield(should_yield),
       
  6961   _inFreeRange(false),           // No free range at beginning of sweep
  6963   _inFreeRange(false),           // No free range at beginning of sweep
  6962   _freeRangeInFreeLists(false),  // No free range at beginning of sweep
  6964   _freeRangeInFreeLists(false),  // No free range at beginning of sweep
  6963   _lastFreeRangeCoalesced(false),
  6965   _lastFreeRangeCoalesced(false),
       
  6966   _yield(should_yield),
  6964   _freeFinger(g->used_region().start())
  6967   _freeFinger(g->used_region().start())
  6965 {
  6968 {
  6966   NOT_PRODUCT(
  6969   NOT_PRODUCT(
  6967     _numObjectsFreed = 0;
  6970     _numObjectsFreed = 0;
  6968     _numWordsFreed   = 0;
  6971     _numWordsFreed   = 0;
  7512   HeapWord* addr = (HeapWord*)obj;
  7515   HeapWord* addr = (HeapWord*)obj;
  7513   return addr != NULL &&
  7516   return addr != NULL &&
  7514          (!_span.contains(addr) || _bit_map->isMarked(addr));
  7517          (!_span.contains(addr) || _bit_map->isMarked(addr));
  7515 }
  7518 }
  7516 
  7519 
  7517 
       
  7518 CMSKeepAliveClosure::CMSKeepAliveClosure( CMSCollector* collector,
  7520 CMSKeepAliveClosure::CMSKeepAliveClosure( CMSCollector* collector,
  7519                       MemRegion span,
  7521                       MemRegion span,
  7520                       CMSBitMap* bit_map, CMSMarkStack* mark_stack,
  7522                       CMSBitMap* bit_map, CMSMarkStack* mark_stack,
  7521                       bool cpc):
  7523                       bool cpc):
  7522   _collector(collector),
  7524   _collector(collector),
  7523   _span(span),
  7525   _span(span),
       
  7526   _mark_stack(mark_stack),
  7524   _bit_map(bit_map),
  7527   _bit_map(bit_map),
  7525   _mark_stack(mark_stack),
       
  7526   _concurrent_precleaning(cpc) {
  7528   _concurrent_precleaning(cpc) {
  7527   assert(!_span.is_empty(), "Empty span could spell trouble");
  7529   assert(!_span.is_empty(), "Empty span could spell trouble");
  7528 }
  7530 }
  7529 
  7531 
  7530 
  7532 
  7608                                 CMSCollector* collector,
  7610                                 CMSCollector* collector,
  7609                                 MemRegion span, CMSBitMap* bit_map,
  7611                                 MemRegion span, CMSBitMap* bit_map,
  7610                                 OopTaskQueue* work_queue):
  7612                                 OopTaskQueue* work_queue):
  7611   _collector(collector),
  7613   _collector(collector),
  7612   _span(span),
  7614   _span(span),
  7613   _bit_map(bit_map),
  7615   _work_queue(work_queue),
  7614   _work_queue(work_queue) { }
  7616   _bit_map(bit_map) { }
  7615 
  7617 
  7616 void CMSInnerParMarkAndPushClosure::do_oop(oop obj) {
  7618 void CMSInnerParMarkAndPushClosure::do_oop(oop obj) {
  7617   HeapWord* addr = (HeapWord*)obj;
  7619   HeapWord* addr = (HeapWord*)obj;
  7618   if (_span.contains(addr) &&
  7620   if (_span.contains(addr) &&
  7619       !_bit_map->isMarked(addr)) {
  7621       !_bit_map->isMarked(addr)) {