hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp
changeset 6250 5680f968c721
parent 6247 00e5cc407d03
child 6759 67b1a69ef5aa
equal deleted inserted replaced
6249:39460062184b 6250:5680f968c721
   120 };
   120 };
   121 
   121 
   122 HRInto_G1RemSet::HRInto_G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs)
   122 HRInto_G1RemSet::HRInto_G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs)
   123   : G1RemSet(g1), _ct_bs(ct_bs), _g1p(_g1->g1_policy()),
   123   : G1RemSet(g1), _ct_bs(ct_bs), _g1p(_g1->g1_policy()),
   124     _cg1r(g1->concurrent_g1_refine()),
   124     _cg1r(g1->concurrent_g1_refine()),
   125     _par_traversal_in_progress(false),
   125     _traversal_in_progress(false),
   126     _cset_rs_update_cl(NULL),
   126     _cset_rs_update_cl(NULL),
   127     _cards_scanned(NULL), _total_cards_scanned(0)
   127     _cards_scanned(NULL), _total_cards_scanned(0)
   128 {
   128 {
   129   _seq_task = new SubTasksDone(NumSeqTasks);
   129   _seq_task = new SubTasksDone(NumSeqTasks);
   130   guarantee(n_workers() > 0, "There should be some workers");
   130   guarantee(n_workers() > 0, "There should be some workers");
   482   // * scanned for references that point into the collection set
   482   // * scanned for references that point into the collection set
   483   //   and the RSet of the corresponding region in the collection set
   483   //   and the RSet of the corresponding region in the collection set
   484   //   is updated immediately.
   484   //   is updated immediately.
   485   DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
   485   DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
   486 
   486 
   487   if (ParallelGCThreads > 0) {
   487   assert((ParallelGCThreads > 0) || worker_i == 0, "invariant");
   488     // The two flags below were introduced temporarily to serialize
   488 
   489     // the updating and scanning of remembered sets. There are some
   489   // The two flags below were introduced temporarily to serialize
   490     // race conditions when these two operations are done in parallel
   490   // the updating and scanning of remembered sets. There are some
   491     // and they are causing failures. When we resolve said race
   491   // race conditions when these two operations are done in parallel
   492     // conditions, we'll revert back to parallel remembered set
   492   // and they are causing failures. When we resolve said race
   493     // updating and scanning. See CRs 6677707 and 6677708.
   493   // conditions, we'll revert back to parallel remembered set
   494     if (G1UseParallelRSetUpdating || (worker_i == 0)) {
   494   // updating and scanning. See CRs 6677707 and 6677708.
   495       updateRS(&into_cset_dcq, worker_i);
   495   if (G1UseParallelRSetUpdating || (worker_i == 0)) {
   496     } else {
   496     updateRS(&into_cset_dcq, worker_i);
   497       _g1p->record_update_rs_processed_buffers(worker_i, 0.0);
       
   498       _g1p->record_update_rs_time(worker_i, 0.0);
       
   499     }
       
   500     if (G1UseParallelRSetScanning || (worker_i == 0)) {
       
   501       scanRS(oc, worker_i);
       
   502     } else {
       
   503       _g1p->record_scan_rs_time(worker_i, 0.0);
       
   504     }
       
   505   } else {
   497   } else {
   506     assert(worker_i == 0, "invariant");
   498     _g1p->record_update_rs_processed_buffers(worker_i, 0.0);
   507     updateRS(&into_cset_dcq, 0);
   499     _g1p->record_update_rs_time(worker_i, 0.0);
   508     scanRS(oc, 0);
   500   }
       
   501   if (G1UseParallelRSetScanning || (worker_i == 0)) {
       
   502     scanRS(oc, worker_i);
       
   503   } else {
       
   504     _g1p->record_scan_rs_time(worker_i, 0.0);
   509   }
   505   }
   510 
   506 
   511   // We now clear the cached values of _cset_rs_update_cl for this worker
   507   // We now clear the cached values of _cset_rs_update_cl for this worker
   512   _cset_rs_update_cl[worker_i] = NULL;
   508   _cset_rs_update_cl[worker_i] = NULL;
   513 }
   509 }
   522   ConcurrentG1Refine* cg1r = _g1->concurrent_g1_refine();
   518   ConcurrentG1Refine* cg1r = _g1->concurrent_g1_refine();
   523   _g1->set_refine_cte_cl_concurrency(false);
   519   _g1->set_refine_cte_cl_concurrency(false);
   524   DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
   520   DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
   525   dcqs.concatenate_logs();
   521   dcqs.concatenate_logs();
   526 
   522 
   527   assert(!_par_traversal_in_progress, "Invariant between iterations.");
   523   assert(!_traversal_in_progress, "Invariant between iterations.");
       
   524   set_traversal(true);
   528   if (ParallelGCThreads > 0) {
   525   if (ParallelGCThreads > 0) {
   529     set_par_traversal(true);
       
   530     _seq_task->set_par_threads((int)n_workers());
   526     _seq_task->set_par_threads((int)n_workers());
   531   }
   527   }
   532   guarantee( _cards_scanned == NULL, "invariant" );
   528   guarantee( _cards_scanned == NULL, "invariant" );
   533   _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers());
   529   _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers());
   534   for (uint i = 0; i < n_workers(); ++i) {
   530   for (uint i = 0; i < n_workers(); ++i) {
   621   cleanUpIteratorsClosure iterClosure;
   617   cleanUpIteratorsClosure iterClosure;
   622   _g1->collection_set_iterate(&iterClosure);
   618   _g1->collection_set_iterate(&iterClosure);
   623   // Set all cards back to clean.
   619   // Set all cards back to clean.
   624   _g1->cleanUpCardTable();
   620   _g1->cleanUpCardTable();
   625 
   621 
   626   if (ParallelGCThreads > 0) {
   622   set_traversal(false);
   627     set_par_traversal(false);
       
   628   }
       
   629 
   623 
   630   DirtyCardQueueSet& into_cset_dcqs = _g1->into_cset_dirty_card_queue_set();
   624   DirtyCardQueueSet& into_cset_dcqs = _g1->into_cset_dirty_card_queue_set();
   631   int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num();
   625   int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num();
   632 
   626 
   633   if (_g1->evacuation_failed()) {
   627   if (_g1->evacuation_failed()) {
   658   _g1->into_cset_dirty_card_queue_set().clear();
   652   _g1->into_cset_dirty_card_queue_set().clear();
   659   assert(_g1->into_cset_dirty_card_queue_set().completed_buffers_num() == 0,
   653   assert(_g1->into_cset_dirty_card_queue_set().completed_buffers_num() == 0,
   660          "all buffers should be freed");
   654          "all buffers should be freed");
   661   _g1->into_cset_dirty_card_queue_set().clear_n_completed_buffers();
   655   _g1->into_cset_dirty_card_queue_set().clear_n_completed_buffers();
   662 
   656 
   663   assert(!_par_traversal_in_progress, "Invariant between iterations.");
   657   assert(!_traversal_in_progress, "Invariant between iterations.");
   664 }
   658 }
   665 
   659 
   666 class UpdateRSObjectClosure: public ObjectClosure {
   660 class UpdateRSObjectClosure: public ObjectClosure {
   667   UpdateRSOopClosure* _update_rs_oop_cl;
   661   UpdateRSOopClosure* _update_rs_oop_cl;
   668 public:
   662 public: