hotspot/src/share/vm/gc/g1/heapRegionRemSet.cpp
changeset 35061 be6025ebffea
parent 34649 0c719dcb4507
child 35199 a12e8d5aa2f7
equal deleted inserted replaced
35060:382d0689141c 35061:be6025ebffea
   558 }
   558 }
   559 
   559 
   560 void OtherRegionsTable::scrub(CardTableModRefBS* ctbs,
   560 void OtherRegionsTable::scrub(CardTableModRefBS* ctbs,
   561                               BitMap* region_bm, BitMap* card_bm) {
   561                               BitMap* region_bm, BitMap* card_bm) {
   562   // First eliminated garbage regions from the coarse map.
   562   // First eliminated garbage regions from the coarse map.
   563   if (G1RSScrubVerbose) {
   563   log_develop_trace(gc, remset, scrub)("Scrubbing region %u:", _hr->hrm_index());
   564     gclog_or_tty->print_cr("Scrubbing region %u:", _hr->hrm_index());
       
   565   }
       
   566 
   564 
   567   assert(_coarse_map.size() == region_bm->size(), "Precondition");
   565   assert(_coarse_map.size() == region_bm->size(), "Precondition");
   568   if (G1RSScrubVerbose) {
   566   log_develop_trace(gc, remset, scrub)("   Coarse map: before = " SIZE_FORMAT "...", _n_coarse_entries);
   569     gclog_or_tty->print("   Coarse map: before = " SIZE_FORMAT "...",
       
   570                         _n_coarse_entries);
       
   571   }
       
   572   _coarse_map.set_intersection(*region_bm);
   567   _coarse_map.set_intersection(*region_bm);
   573   _n_coarse_entries = _coarse_map.count_one_bits();
   568   _n_coarse_entries = _coarse_map.count_one_bits();
   574   if (G1RSScrubVerbose) {
   569   log_develop_trace(gc, remset, scrub)("   after = " SIZE_FORMAT ".", _n_coarse_entries);
   575     gclog_or_tty->print_cr("   after = " SIZE_FORMAT ".", _n_coarse_entries);
       
   576   }
       
   577 
   570 
   578   // Now do the fine-grained maps.
   571   // Now do the fine-grained maps.
   579   for (size_t i = 0; i < _max_fine_entries; i++) {
   572   for (size_t i = 0; i < _max_fine_entries; i++) {
   580     PerRegionTable* cur = _fine_grain_regions[i];
   573     PerRegionTable* cur = _fine_grain_regions[i];
   581     PerRegionTable** prev = &_fine_grain_regions[i];
   574     PerRegionTable** prev = &_fine_grain_regions[i];
   582     while (cur != NULL) {
   575     while (cur != NULL) {
   583       PerRegionTable* nxt = cur->collision_list_next();
   576       PerRegionTable* nxt = cur->collision_list_next();
   584       // If the entire region is dead, eliminate.
   577       // If the entire region is dead, eliminate.
   585       if (G1RSScrubVerbose) {
   578       log_develop_trace(gc, remset, scrub)("     For other region %u:", cur->hr()->hrm_index());
   586         gclog_or_tty->print_cr("     For other region %u:",
       
   587                                cur->hr()->hrm_index());
       
   588       }
       
   589       if (!region_bm->at((size_t) cur->hr()->hrm_index())) {
   579       if (!region_bm->at((size_t) cur->hr()->hrm_index())) {
   590         *prev = nxt;
   580         *prev = nxt;
   591         cur->set_collision_list_next(NULL);
   581         cur->set_collision_list_next(NULL);
   592         _n_fine_entries--;
   582         _n_fine_entries--;
   593         if (G1RSScrubVerbose) {
   583         log_develop_trace(gc, remset, scrub)("          deleted via region map.");
   594           gclog_or_tty->print_cr("          deleted via region map.");
       
   595         }
       
   596         unlink_from_all(cur);
   584         unlink_from_all(cur);
   597         PerRegionTable::free(cur);
   585         PerRegionTable::free(cur);
   598       } else {
   586       } else {
   599         // Do fine-grain elimination.
   587         // Do fine-grain elimination.
   600         if (G1RSScrubVerbose) {
   588         log_develop_trace(gc, remset, scrub)("          occ: before = %4d.", cur->occupied());
   601           gclog_or_tty->print("          occ: before = %4d.", cur->occupied());
       
   602         }
       
   603         cur->scrub(ctbs, card_bm);
   589         cur->scrub(ctbs, card_bm);
   604         if (G1RSScrubVerbose) {
   590         log_develop_trace(gc, remset, scrub)("          after = %4d.", cur->occupied());
   605           gclog_or_tty->print_cr("          after = %4d.", cur->occupied());
       
   606         }
       
   607         // Did that empty the table completely?
   591         // Did that empty the table completely?
   608         if (cur->occupied() == 0) {
   592         if (cur->occupied() == 0) {
   609           *prev = nxt;
   593           *prev = nxt;
   610           cur->set_collision_list_next(NULL);
   594           cur->set_collision_list_next(NULL);
   611           _n_fine_entries--;
   595           _n_fine_entries--;
   797   HeapRegionRemSetIterator iter(this);
   781   HeapRegionRemSetIterator iter(this);
   798   size_t card_index;
   782   size_t card_index;
   799   while (iter.has_next(card_index)) {
   783   while (iter.has_next(card_index)) {
   800     HeapWord* card_start =
   784     HeapWord* card_start =
   801       G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index);
   785       G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index);
   802     gclog_or_tty->print_cr("  Card " PTR_FORMAT, p2i(card_start));
   786     tty->print_cr("  Card " PTR_FORMAT, p2i(card_start));
   803   }
   787   }
   804   if (iter.n_yielded() != occupied()) {
   788   if (iter.n_yielded() != occupied()) {
   805     gclog_or_tty->print_cr("Yielded disagrees with occupied:");
   789     tty->print_cr("Yielded disagrees with occupied:");
   806     gclog_or_tty->print_cr("  " SIZE_FORMAT_W(6) " yielded (" SIZE_FORMAT_W(6)
   790     tty->print_cr("  " SIZE_FORMAT_W(6) " yielded (" SIZE_FORMAT_W(6)
   807                   " coarse, " SIZE_FORMAT_W(6) " fine).",
   791                   " coarse, " SIZE_FORMAT_W(6) " fine).",
   808                   iter.n_yielded(),
   792                   iter.n_yielded(),
   809                   iter.n_yielded_coarse(), iter.n_yielded_fine());
   793                   iter.n_yielded_coarse(), iter.n_yielded_fine());
   810     gclog_or_tty->print_cr("  " SIZE_FORMAT_W(6) " occ     (" SIZE_FORMAT_W(6)
   794     tty->print_cr("  " SIZE_FORMAT_W(6) " occ     (" SIZE_FORMAT_W(6)
   811                            " coarse, " SIZE_FORMAT_W(6) " fine).",
   795                            " coarse, " SIZE_FORMAT_W(6) " fine).",
   812                   occupied(), occ_coarse(), occ_fine());
   796                   occupied(), occ_coarse(), occ_fine());
   813   }
   797   }
   814   guarantee(iter.n_yielded() == occupied(),
   798   guarantee(iter.n_yielded() == occupied(),
   815             "We should have yielded all the represented cards.");
   799             "We should have yielded all the represented cards.");
  1069   size_t sum = 0;
  1053   size_t sum = 0;
  1070   size_t card_index;
  1054   size_t card_index;
  1071   while (iter.has_next(card_index)) {
  1055   while (iter.has_next(card_index)) {
  1072     HeapWord* card_start =
  1056     HeapWord* card_start =
  1073       G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index);
  1057       G1CollectedHeap::heap()->bot_shared()->address_for_index(card_index);
  1074     gclog_or_tty->print_cr("  Card " PTR_FORMAT ".", p2i(card_start));
  1058     tty->print_cr("  Card " PTR_FORMAT ".", p2i(card_start));
  1075     sum++;
  1059     sum++;
  1076   }
  1060   }
  1077   guarantee(sum == 11 - 3 + 2048, "Failure");
  1061   guarantee(sum == 11 - 3 + 2048, "Failure");
  1078   guarantee(sum == hrrs->occupied(), "Failure");
  1062   guarantee(sum == hrrs->occupied(), "Failure");
  1079 }
  1063 }