hotspot/src/share/vm/gc/g1/heapRegionRemSet.cpp
changeset 38156 e0ff734fa7de
parent 37988 bf4018edea5e
child 38161 1c7dd1e39fcf
equal deleted inserted replaced
38155:a4501a2965dc 38156:e0ff734fa7de
   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 }