263 false /* in-resource-area */), |
263 false /* in-resource-area */), |
264 _fine_grain_regions(NULL), |
264 _fine_grain_regions(NULL), |
265 _first_all_fine_prts(NULL), _last_all_fine_prts(NULL), |
265 _first_all_fine_prts(NULL), _last_all_fine_prts(NULL), |
266 _n_fine_entries(0), _n_coarse_entries(0), |
266 _n_fine_entries(0), _n_coarse_entries(0), |
267 _fine_eviction_start(0), |
267 _fine_eviction_start(0), |
268 _sparse_table(hr) |
268 _sparse_table(hr), |
|
269 _coarse_dirty(false) |
269 { |
270 { |
270 typedef PerRegionTable* PerRegionTablePtr; |
271 typedef PerRegionTable* PerRegionTablePtr; |
271 |
272 |
272 if (_max_fine_entries == 0) { |
273 if (_max_fine_entries == 0) { |
273 assert(_mod_max_fine_entries_mask == 0, "Both or none."); |
274 assert(_mod_max_fine_entries_mask == 0, "Both or none."); |
502 |
503 |
503 // Set the corresponding coarse bit. |
504 // Set the corresponding coarse bit. |
504 size_t max_hrm_index = (size_t) max->hr()->hrm_index(); |
505 size_t max_hrm_index = (size_t) max->hr()->hrm_index(); |
505 if (!_coarse_map.at(max_hrm_index)) { |
506 if (!_coarse_map.at(max_hrm_index)) { |
506 _coarse_map.at_put(max_hrm_index, true); |
507 _coarse_map.at_put(max_hrm_index, true); |
|
508 _coarse_dirty = true; |
507 _n_coarse_entries++; |
509 _n_coarse_entries++; |
508 } |
510 } |
509 |
511 |
510 // Unsplice. |
512 // Unsplice. |
511 *max_prev = max->collision_list_next(); |
513 *max_prev = max->collision_list_next(); |
517 void OtherRegionsTable::scrub(G1CardLiveData* live_data) { |
519 void OtherRegionsTable::scrub(G1CardLiveData* live_data) { |
518 // First eliminated garbage regions from the coarse map. |
520 // First eliminated garbage regions from the coarse map. |
519 log_develop_trace(gc, remset, scrub)("Scrubbing region %u:", _hr->hrm_index()); |
521 log_develop_trace(gc, remset, scrub)("Scrubbing region %u:", _hr->hrm_index()); |
520 |
522 |
521 log_develop_trace(gc, remset, scrub)(" Coarse map: before = " SIZE_FORMAT "...", _n_coarse_entries); |
523 log_develop_trace(gc, remset, scrub)(" Coarse map: before = " SIZE_FORMAT "...", _n_coarse_entries); |
522 live_data->remove_nonlive_regions(&_coarse_map); |
524 if (_coarse_dirty) { |
523 _n_coarse_entries = _coarse_map.count_one_bits(); |
525 live_data->remove_nonlive_regions(&_coarse_map); |
|
526 _n_coarse_entries = _coarse_map.count_one_bits(); |
|
527 _coarse_dirty = _n_coarse_entries != 0; |
|
528 } |
524 log_develop_trace(gc, remset, scrub)(" after = " SIZE_FORMAT ".", _n_coarse_entries); |
529 log_develop_trace(gc, remset, scrub)(" after = " SIZE_FORMAT ".", _n_coarse_entries); |
525 |
530 |
526 // Now do the fine-grained maps. |
531 // Now do the fine-grained maps. |
527 for (size_t i = 0; i < _max_fine_entries; i++) { |
532 for (size_t i = 0; i < _max_fine_entries; i++) { |
528 PerRegionTable* cur = _fine_grain_regions[i]; |
533 PerRegionTable* cur = _fine_grain_regions[i]; |
644 guarantee(_first_all_fine_prts == NULL && _last_all_fine_prts == NULL, "just checking"); |
649 guarantee(_first_all_fine_prts == NULL && _last_all_fine_prts == NULL, "just checking"); |
645 } |
650 } |
646 |
651 |
647 _first_all_fine_prts = _last_all_fine_prts = NULL; |
652 _first_all_fine_prts = _last_all_fine_prts = NULL; |
648 _sparse_table.clear(); |
653 _sparse_table.clear(); |
649 _coarse_map.clear(); |
654 if (_coarse_dirty) { |
|
655 _coarse_map.clear(); |
|
656 _coarse_dirty = false; |
|
657 } |
650 _n_fine_entries = 0; |
658 _n_fine_entries = 0; |
651 _n_coarse_entries = 0; |
659 _n_coarse_entries = 0; |
652 |
660 |
653 clear_fcc(); |
661 clear_fcc(); |
654 } |
662 } |