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."); |