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
|