hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp
changeset 4902 991aaddb5165
parent 4900 3fab535e2fd6
child 5346 be3f9bf8c3a6
equal deleted inserted replaced
4901:304ce755c6ee 4902:991aaddb5165
   503   _sparse_table(hr)
   503   _sparse_table(hr)
   504 {
   504 {
   505   typedef PosParPRT* PosParPRTPtr;
   505   typedef PosParPRT* PosParPRTPtr;
   506   if (_max_fine_entries == 0) {
   506   if (_max_fine_entries == 0) {
   507     assert(_mod_max_fine_entries_mask == 0, "Both or none.");
   507     assert(_mod_max_fine_entries_mask == 0, "Both or none.");
   508     _max_fine_entries = (size_t)(1 << G1LogRSRegionEntries);
   508     size_t max_entries_log = (size_t)log2_long((jlong)G1RSetRegionEntries);
       
   509     _max_fine_entries = (size_t)(1 << max_entries_log);
   509     _mod_max_fine_entries_mask = _max_fine_entries - 1;
   510     _mod_max_fine_entries_mask = _max_fine_entries - 1;
   510 #if SAMPLE_FOR_EVICTION
   511 #if SAMPLE_FOR_EVICTION
   511     assert(_fine_eviction_sample_size == 0
   512     assert(_fine_eviction_sample_size == 0
   512            && _fine_eviction_stride == 0, "All init at same time.");
   513            && _fine_eviction_stride == 0, "All init at same time.");
   513     _fine_eviction_sample_size = MAX2((size_t)4, (size_t)G1LogRSRegionEntries);
   514     _fine_eviction_sample_size = MAX2((size_t)4, max_entries_log);
   514     _fine_eviction_stride = _max_fine_entries / _fine_eviction_sample_size;
   515     _fine_eviction_stride = _max_fine_entries / _fine_eviction_sample_size;
   515 #endif
   516 #endif
   516   }
   517   }
   517   _fine_grain_regions = new PosParPRTPtr[_max_fine_entries];
   518   _fine_grain_regions = new PosParPRTPtr[_max_fine_entries];
   518   if (_fine_grain_regions == NULL)
   519   if (_fine_grain_regions == NULL)
   653                       "overflow(f: %d, t: %d)",
   654                       "overflow(f: %d, t: %d)",
   654                       tid, from_hrs_ind, cur_hrs_ind);
   655                       tid, from_hrs_ind, cur_hrs_ind);
   655 #endif
   656 #endif
   656       }
   657       }
   657 
   658 
   658       // Otherwise, transfer from sparse to fine-grain.
       
   659       CardIdx_t cards[SparsePRTEntry::CardsPerEntry];
       
   660       if (G1HRRSUseSparseTable) {
       
   661         bool res = _sparse_table.get_cards(from_hrs_ind, &cards[0]);
       
   662         assert(res, "There should have been an entry");
       
   663       }
       
   664 
       
   665       if (_n_fine_entries == _max_fine_entries) {
   659       if (_n_fine_entries == _max_fine_entries) {
   666         prt = delete_region_table();
   660         prt = delete_region_table();
   667       } else {
   661       } else {
   668         prt = PosParPRT::alloc(from_hr);
   662         prt = PosParPRT::alloc(from_hr);
   669       }
   663       }
   674       PosParPRT* first_prt = _fine_grain_regions[ind];
   668       PosParPRT* first_prt = _fine_grain_regions[ind];
   675       prt->set_next(first_prt);  // XXX Maybe move to init?
   669       prt->set_next(first_prt);  // XXX Maybe move to init?
   676       _fine_grain_regions[ind] = prt;
   670       _fine_grain_regions[ind] = prt;
   677       _n_fine_entries++;
   671       _n_fine_entries++;
   678 
   672 
   679       // Add in the cards from the sparse table.
       
   680       if (G1HRRSUseSparseTable) {
   673       if (G1HRRSUseSparseTable) {
   681         for (int i = 0; i < SparsePRTEntry::CardsPerEntry; i++) {
   674         // Transfer from sparse to fine-grain.
   682           CardIdx_t c = cards[i];
   675         SparsePRTEntry *sprt_entry = _sparse_table.get_entry(from_hrs_ind);
       
   676         assert(sprt_entry != NULL, "There should have been an entry");
       
   677         for (int i = 0; i < SparsePRTEntry::cards_num(); i++) {
       
   678           CardIdx_t c = sprt_entry->card(i);
   683           if (c != SparsePRTEntry::NullEntry) {
   679           if (c != SparsePRTEntry::NullEntry) {
   684             prt->add_card(c);
   680             prt->add_card(c);
   685           }
   681           }
   686         }
   682         }
   687         // Now we can delete the sparse entry.
   683         // Now we can delete the sparse entry.
  1082                            false /* in-resource-area */),
  1078                            false /* in-resource-area */),
  1083       _iter_state(Unclaimed)
  1079       _iter_state(Unclaimed)
  1084 {}
  1080 {}
  1085 
  1081 
  1086 
  1082 
       
  1083 void HeapRegionRemSet::setup_remset_size() {
       
  1084   // Setup sparse and fine-grain tables sizes.
       
  1085   // table_size = base * (log(region_size / 1M) + 1)
       
  1086   int region_size_log_mb = MAX2((int)HeapRegion::LogOfHRGrainBytes - (int)LOG_M, 0);
       
  1087   if (FLAG_IS_DEFAULT(G1RSetSparseRegionEntries)) {
       
  1088     G1RSetSparseRegionEntries = G1RSetSparseRegionEntriesBase * (region_size_log_mb + 1);
       
  1089   }
       
  1090   if (FLAG_IS_DEFAULT(G1RSetRegionEntries)) {
       
  1091     G1RSetRegionEntries = G1RSetRegionEntriesBase * (region_size_log_mb + 1);
       
  1092   }
       
  1093   guarantee(G1RSetSparseRegionEntries > 0 && G1RSetRegionEntries > 0 , "Sanity");
       
  1094 }
       
  1095 
  1087 void HeapRegionRemSet::init_for_par_iteration() {
  1096 void HeapRegionRemSet::init_for_par_iteration() {
  1088   _iter_state = Unclaimed;
  1097   _iter_state = Unclaimed;
  1089 }
  1098 }
  1090 
  1099 
  1091 bool HeapRegionRemSet::claim_iter() {
  1100 bool HeapRegionRemSet::claim_iter() {
  1397 #ifndef PRODUCT
  1406 #ifndef PRODUCT
  1398 void HeapRegionRemSet::test() {
  1407 void HeapRegionRemSet::test() {
  1399   os::sleep(Thread::current(), (jlong)5000, false);
  1408   os::sleep(Thread::current(), (jlong)5000, false);
  1400   G1CollectedHeap* g1h = G1CollectedHeap::heap();
  1409   G1CollectedHeap* g1h = G1CollectedHeap::heap();
  1401 
  1410 
  1402   // Run with "-XX:G1LogRSRegionEntries=2", so that 1 and 5 end up in same
  1411   // Run with "-XX:G1LogRSetRegionEntries=2", so that 1 and 5 end up in same
  1403   // hash bucket.
  1412   // hash bucket.
  1404   HeapRegion* hr0 = g1h->region_at(0);
  1413   HeapRegion* hr0 = g1h->region_at(0);
  1405   HeapRegion* hr1 = g1h->region_at(1);
  1414   HeapRegion* hr1 = g1h->region_at(1);
  1406   HeapRegion* hr2 = g1h->region_at(5);
  1415   HeapRegion* hr2 = g1h->region_at(5);
  1407   HeapRegion* hr3 = g1h->region_at(6);
  1416   HeapRegion* hr3 = g1h->region_at(6);