src/share/vm/gc_implementation/g1/g1RemSet.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 80060074 Sdiff src/share/vm/gc_implementation/g1

src/share/vm/gc_implementation/g1/g1RemSet.cpp

Print this page




  77     _cg1r(g1->concurrent_g1_refine()),
  78     _cset_rs_update_cl(NULL),
  79     _cards_scanned(NULL), _total_cards_scanned(0),
  80     _prev_period_summary()
  81 {
  82   _seq_task = new SubTasksDone(NumSeqTasks);
  83   _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC);
  84   for (uint i = 0; i < n_workers(); i++) {
  85     _cset_rs_update_cl[i] = NULL;
  86   }
  87   if (G1SummarizeRSetStats) {
  88     _prev_period_summary.initialize(this);
  89   }
  90 }
  91 
  92 G1RemSet::~G1RemSet() {
  93   delete _seq_task;
  94   for (uint i = 0; i < n_workers(); i++) {
  95     assert(_cset_rs_update_cl[i] == NULL, "it should be");
  96   }
  97   FREE_C_HEAP_ARRAY(OopsInHeapRegionClosure*, _cset_rs_update_cl, mtGC);
  98 }
  99 
 100 void CountNonCleanMemRegionClosure::do_MemRegion(MemRegion mr) {
 101   if (_g1->is_in_g1_reserved(mr.start())) {
 102     _n += (int) ((mr.byte_size() / CardTableModRefBS::card_size));
 103     if (_start_first == NULL) _start_first = mr.start();
 104   }
 105 }
 106 
 107 class ScanRSClosure : public HeapRegionClosure {
 108   size_t _cards_done, _cards;
 109   G1CollectedHeap* _g1h;
 110 
 111   OopsInHeapRegionClosure* _oc;
 112   CodeBlobClosure* _code_root_cl;
 113 
 114   G1BlockOffsetSharedArray* _bot_shared;
 115   G1SATBCardTableModRefBS *_ct_bs;
 116 
 117   double _strong_code_root_scan_time_sec;


 352 void G1RemSet::prepare_for_oops_into_collection_set_do() {
 353   cleanupHRRS();
 354   _g1->set_refine_cte_cl_concurrency(false);
 355   DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
 356   dcqs.concatenate_logs();
 357 
 358   guarantee( _cards_scanned == NULL, "invariant" );
 359   _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers(), mtGC);
 360   for (uint i = 0; i < n_workers(); ++i) {
 361     _cards_scanned[i] = 0;
 362   }
 363   _total_cards_scanned = 0;
 364 }
 365 
 366 void G1RemSet::cleanup_after_oops_into_collection_set_do() {
 367   guarantee( _cards_scanned != NULL, "invariant" );
 368   _total_cards_scanned = 0;
 369   for (uint i = 0; i < n_workers(); ++i) {
 370     _total_cards_scanned += _cards_scanned[i];
 371   }
 372   FREE_C_HEAP_ARRAY(size_t, _cards_scanned, mtGC);
 373   _cards_scanned = NULL;
 374   // Cleanup after copy
 375   _g1->set_refine_cte_cl_concurrency(true);
 376   // Set all cards back to clean.
 377   _g1->cleanUpCardTable();
 378 
 379   DirtyCardQueueSet& into_cset_dcqs = _g1->into_cset_dirty_card_queue_set();
 380   int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num();
 381 
 382   if (_g1->evacuation_failed()) {
 383     double restore_remembered_set_start = os::elapsedTime();
 384 
 385     // Restore remembered sets for the regions pointing into the collection set.
 386     // We just need to transfer the completed buffers from the DirtyCardQueueSet
 387     // used to hold cards that contain references that point into the collection set
 388     // to the DCQS used to hold the deferred RS updates.
 389     _g1->dirty_card_queue_set().merge_bufferlists(&into_cset_dcqs);
 390     _g1->g1_policy()->phase_times()->record_evac_fail_restore_remsets((os::elapsedTime() - restore_remembered_set_start) * 1000.0);
 391   }
 392 




  77     _cg1r(g1->concurrent_g1_refine()),
  78     _cset_rs_update_cl(NULL),
  79     _cards_scanned(NULL), _total_cards_scanned(0),
  80     _prev_period_summary()
  81 {
  82   _seq_task = new SubTasksDone(NumSeqTasks);
  83   _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC);
  84   for (uint i = 0; i < n_workers(); i++) {
  85     _cset_rs_update_cl[i] = NULL;
  86   }
  87   if (G1SummarizeRSetStats) {
  88     _prev_period_summary.initialize(this);
  89   }
  90 }
  91 
  92 G1RemSet::~G1RemSet() {
  93   delete _seq_task;
  94   for (uint i = 0; i < n_workers(); i++) {
  95     assert(_cset_rs_update_cl[i] == NULL, "it should be");
  96   }
  97   FREE_C_HEAP_ARRAY(OopsInHeapRegionClosure*, _cset_rs_update_cl);
  98 }
  99 
 100 void CountNonCleanMemRegionClosure::do_MemRegion(MemRegion mr) {
 101   if (_g1->is_in_g1_reserved(mr.start())) {
 102     _n += (int) ((mr.byte_size() / CardTableModRefBS::card_size));
 103     if (_start_first == NULL) _start_first = mr.start();
 104   }
 105 }
 106 
 107 class ScanRSClosure : public HeapRegionClosure {
 108   size_t _cards_done, _cards;
 109   G1CollectedHeap* _g1h;
 110 
 111   OopsInHeapRegionClosure* _oc;
 112   CodeBlobClosure* _code_root_cl;
 113 
 114   G1BlockOffsetSharedArray* _bot_shared;
 115   G1SATBCardTableModRefBS *_ct_bs;
 116 
 117   double _strong_code_root_scan_time_sec;


 352 void G1RemSet::prepare_for_oops_into_collection_set_do() {
 353   cleanupHRRS();
 354   _g1->set_refine_cte_cl_concurrency(false);
 355   DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
 356   dcqs.concatenate_logs();
 357 
 358   guarantee( _cards_scanned == NULL, "invariant" );
 359   _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers(), mtGC);
 360   for (uint i = 0; i < n_workers(); ++i) {
 361     _cards_scanned[i] = 0;
 362   }
 363   _total_cards_scanned = 0;
 364 }
 365 
 366 void G1RemSet::cleanup_after_oops_into_collection_set_do() {
 367   guarantee( _cards_scanned != NULL, "invariant" );
 368   _total_cards_scanned = 0;
 369   for (uint i = 0; i < n_workers(); ++i) {
 370     _total_cards_scanned += _cards_scanned[i];
 371   }
 372   FREE_C_HEAP_ARRAY(size_t, _cards_scanned);
 373   _cards_scanned = NULL;
 374   // Cleanup after copy
 375   _g1->set_refine_cte_cl_concurrency(true);
 376   // Set all cards back to clean.
 377   _g1->cleanUpCardTable();
 378 
 379   DirtyCardQueueSet& into_cset_dcqs = _g1->into_cset_dirty_card_queue_set();
 380   int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num();
 381 
 382   if (_g1->evacuation_failed()) {
 383     double restore_remembered_set_start = os::elapsedTime();
 384 
 385     // Restore remembered sets for the regions pointing into the collection set.
 386     // We just need to transfer the completed buffers from the DirtyCardQueueSet
 387     // used to hold cards that contain references that point into the collection set
 388     // to the DCQS used to hold the deferred RS updates.
 389     _g1->dirty_card_queue_set().merge_bufferlists(&into_cset_dcqs);
 390     _g1->g1_policy()->phase_times()->record_evac_fail_restore_remsets((os::elapsedTime() - restore_remembered_set_start) * 1000.0);
 391   }
 392 


src/share/vm/gc_implementation/g1/g1RemSet.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File