Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp @ 20378:39189caa2894
Merge
author | tschatzl |
---|---|
date | Fri, 29 Aug 2014 13:12:03 +0200 |
parents | 833b0f92429a a8ea2f110d87 |
children | 66d359ee9681 |
comparison
equal
deleted
inserted
replaced
20373:c67b85c32d9a | 20378:39189caa2894 |
---|---|
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "gc_implementation/g1/concurrentG1Refine.hpp" | 26 #include "gc_implementation/g1/concurrentG1Refine.hpp" |
27 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp" | 27 #include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp" |
28 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | 28 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" |
29 #include "gc_implementation/g1/heapRegionRemSet.hpp" | 29 #include "gc_implementation/g1/heapRegionRemSet.hpp" |
30 #include "gc_implementation/g1/heapRegionSeq.inline.hpp" | 30 #include "gc_implementation/g1/heapRegionManager.inline.hpp" |
31 #include "memory/allocation.hpp" | 31 #include "memory/allocation.hpp" |
32 #include "memory/padded.inline.hpp" | 32 #include "memory/padded.inline.hpp" |
33 #include "memory/space.inline.hpp" | 33 #include "memory/space.inline.hpp" |
34 #include "oops/oop.inline.hpp" | 34 #include "oops/oop.inline.hpp" |
35 #include "utilities/bitMap.inline.hpp" | 35 #include "utilities/bitMap.inline.hpp" |
417 void OtherRegionsTable::print_from_card_cache() { | 417 void OtherRegionsTable::print_from_card_cache() { |
418 FromCardCache::print(); | 418 FromCardCache::print(); |
419 } | 419 } |
420 | 420 |
421 void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) { | 421 void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) { |
422 uint cur_hrs_ind = hr()->hrs_index(); | 422 uint cur_hrm_ind = hr()->hrm_index(); |
423 | 423 |
424 if (G1TraceHeapRegionRememberedSet) { | 424 if (G1TraceHeapRegionRememberedSet) { |
425 gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").", | 425 gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").", |
426 from, | 426 from, |
427 UseCompressedOops | 427 UseCompressedOops |
432 int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift); | 432 int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift); |
433 | 433 |
434 if (G1TraceHeapRegionRememberedSet) { | 434 if (G1TraceHeapRegionRememberedSet) { |
435 gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = "INT32_FORMAT")", | 435 gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = "INT32_FORMAT")", |
436 hr()->bottom(), from_card, | 436 hr()->bottom(), from_card, |
437 FromCardCache::at((uint)tid, cur_hrs_ind)); | 437 FromCardCache::at((uint)tid, cur_hrm_ind)); |
438 } | 438 } |
439 | 439 |
440 if (FromCardCache::contains_or_replace((uint)tid, cur_hrs_ind, from_card)) { | 440 if (FromCardCache::contains_or_replace((uint)tid, cur_hrm_ind, from_card)) { |
441 if (G1TraceHeapRegionRememberedSet) { | 441 if (G1TraceHeapRegionRememberedSet) { |
442 gclog_or_tty->print_cr(" from-card cache hit."); | 442 gclog_or_tty->print_cr(" from-card cache hit."); |
443 } | 443 } |
444 assert(contains_reference(from), "We just added it!"); | 444 assert(contains_reference(from), "We just added it!"); |
445 return; | 445 return; |
446 } | 446 } |
447 | 447 |
448 // Note that this may be a continued H region. | 448 // Note that this may be a continued H region. |
449 HeapRegion* from_hr = _g1h->heap_region_containing_raw(from); | 449 HeapRegion* from_hr = _g1h->heap_region_containing_raw(from); |
450 RegionIdx_t from_hrs_ind = (RegionIdx_t) from_hr->hrs_index(); | 450 RegionIdx_t from_hrs_ind = (RegionIdx_t) from_hr->hrm_index(); |
451 | 451 |
452 // If the region is already coarsened, return. | 452 // If the region is already coarsened, return. |
453 if (_coarse_map.at(from_hrs_ind)) { | 453 if (_coarse_map.at(from_hrs_ind)) { |
454 if (G1TraceHeapRegionRememberedSet) { | 454 if (G1TraceHeapRegionRememberedSet) { |
455 gclog_or_tty->print_cr(" coarse map hit."); | 455 gclog_or_tty->print_cr(" coarse map hit."); |
491 assert(contains_reference_locked(from), "We just added it!"); | 491 assert(contains_reference_locked(from), "We just added it!"); |
492 return; | 492 return; |
493 } else { | 493 } else { |
494 if (G1TraceHeapRegionRememberedSet) { | 494 if (G1TraceHeapRegionRememberedSet) { |
495 gclog_or_tty->print_cr(" [tid %d] sparse table entry " | 495 gclog_or_tty->print_cr(" [tid %d] sparse table entry " |
496 "overflow(f: %d, t: %d)", | 496 "overflow(f: %d, t: %u)", |
497 tid, from_hrs_ind, cur_hrs_ind); | 497 tid, from_hrs_ind, cur_hrm_ind); |
498 } | 498 } |
499 } | 499 } |
500 | 500 |
501 if (_n_fine_entries == _max_fine_entries) { | 501 if (_n_fine_entries == _max_fine_entries) { |
502 prt = delete_region_table(); | 502 prt = delete_region_table(); |
604 } | 604 } |
605 | 605 |
606 guarantee(max != NULL, "Since _n_fine_entries > 0"); | 606 guarantee(max != NULL, "Since _n_fine_entries > 0"); |
607 | 607 |
608 // Set the corresponding coarse bit. | 608 // Set the corresponding coarse bit. |
609 size_t max_hrs_index = (size_t) max->hr()->hrs_index(); | 609 size_t max_hrm_index = (size_t) max->hr()->hrm_index(); |
610 if (!_coarse_map.at(max_hrs_index)) { | 610 if (!_coarse_map.at(max_hrm_index)) { |
611 _coarse_map.at_put(max_hrs_index, true); | 611 _coarse_map.at_put(max_hrm_index, true); |
612 _n_coarse_entries++; | 612 _n_coarse_entries++; |
613 if (G1TraceHeapRegionRememberedSet) { | 613 if (G1TraceHeapRegionRememberedSet) { |
614 gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] " | 614 gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] " |
615 "for region [" PTR_FORMAT "...] (%d coarse entries).\n", | 615 "for region [" PTR_FORMAT "...] (%d coarse entries).\n", |
616 hr()->bottom(), | 616 hr()->bottom(), |
630 // At present, this must be called stop-world single-threaded. | 630 // At present, this must be called stop-world single-threaded. |
631 void OtherRegionsTable::scrub(CardTableModRefBS* ctbs, | 631 void OtherRegionsTable::scrub(CardTableModRefBS* ctbs, |
632 BitMap* region_bm, BitMap* card_bm) { | 632 BitMap* region_bm, BitMap* card_bm) { |
633 // First eliminated garbage regions from the coarse map. | 633 // First eliminated garbage regions from the coarse map. |
634 if (G1RSScrubVerbose) { | 634 if (G1RSScrubVerbose) { |
635 gclog_or_tty->print_cr("Scrubbing region %u:", hr()->hrs_index()); | 635 gclog_or_tty->print_cr("Scrubbing region %u:", hr()->hrm_index()); |
636 } | 636 } |
637 | 637 |
638 assert(_coarse_map.size() == region_bm->size(), "Precondition"); | 638 assert(_coarse_map.size() == region_bm->size(), "Precondition"); |
639 if (G1RSScrubVerbose) { | 639 if (G1RSScrubVerbose) { |
640 gclog_or_tty->print(" Coarse map: before = "SIZE_FORMAT"...", | 640 gclog_or_tty->print(" Coarse map: before = "SIZE_FORMAT"...", |
653 while (cur != NULL) { | 653 while (cur != NULL) { |
654 PerRegionTable* nxt = cur->collision_list_next(); | 654 PerRegionTable* nxt = cur->collision_list_next(); |
655 // If the entire region is dead, eliminate. | 655 // If the entire region is dead, eliminate. |
656 if (G1RSScrubVerbose) { | 656 if (G1RSScrubVerbose) { |
657 gclog_or_tty->print_cr(" For other region %u:", | 657 gclog_or_tty->print_cr(" For other region %u:", |
658 cur->hr()->hrs_index()); | 658 cur->hr()->hrm_index()); |
659 } | 659 } |
660 if (!region_bm->at((size_t) cur->hr()->hrs_index())) { | 660 if (!region_bm->at((size_t) cur->hr()->hrm_index())) { |
661 *prev = nxt; | 661 *prev = nxt; |
662 cur->set_collision_list_next(NULL); | 662 cur->set_collision_list_next(NULL); |
663 _n_fine_entries--; | 663 _n_fine_entries--; |
664 if (G1RSScrubVerbose) { | 664 if (G1RSScrubVerbose) { |
665 gclog_or_tty->print_cr(" deleted via region map."); | 665 gclog_or_tty->print_cr(" deleted via region map."); |
749 size_t OtherRegionsTable::fl_mem_size() { | 749 size_t OtherRegionsTable::fl_mem_size() { |
750 return PerRegionTable::fl_mem_size(); | 750 return PerRegionTable::fl_mem_size(); |
751 } | 751 } |
752 | 752 |
753 void OtherRegionsTable::clear_fcc() { | 753 void OtherRegionsTable::clear_fcc() { |
754 FromCardCache::clear(hr()->hrs_index()); | 754 FromCardCache::clear(hr()->hrm_index()); |
755 } | 755 } |
756 | 756 |
757 void OtherRegionsTable::clear() { | 757 void OtherRegionsTable::clear() { |
758 // if there are no entries, skip this step | 758 // if there are no entries, skip this step |
759 if (_first_all_fine_prts != NULL) { | 759 if (_first_all_fine_prts != NULL) { |
800 return contains_reference_locked(from); | 800 return contains_reference_locked(from); |
801 } | 801 } |
802 | 802 |
803 bool OtherRegionsTable::contains_reference_locked(OopOrNarrowOopStar from) const { | 803 bool OtherRegionsTable::contains_reference_locked(OopOrNarrowOopStar from) const { |
804 HeapRegion* hr = _g1h->heap_region_containing_raw(from); | 804 HeapRegion* hr = _g1h->heap_region_containing_raw(from); |
805 RegionIdx_t hr_ind = (RegionIdx_t) hr->hrs_index(); | 805 RegionIdx_t hr_ind = (RegionIdx_t) hr->hrm_index(); |
806 // Is this region in the coarse map? | 806 // Is this region in the coarse map? |
807 if (_coarse_map.at(hr_ind)) return true; | 807 if (_coarse_map.at(hr_ind)) return true; |
808 | 808 |
809 PerRegionTable* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask, | 809 PerRegionTable* prt = find_region_table(hr_ind & _mod_max_fine_entries_mask, |
810 hr); | 810 hr); |
837 } | 837 } |
838 | 838 |
839 HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetSharedArray* bosa, | 839 HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetSharedArray* bosa, |
840 HeapRegion* hr) | 840 HeapRegion* hr) |
841 : _bosa(bosa), | 841 : _bosa(bosa), |
842 _m(Mutex::leaf, FormatBuffer<128>("HeapRegionRemSet lock #%u", hr->hrs_index()), true), | 842 _m(Mutex::leaf, FormatBuffer<128>("HeapRegionRemSet lock #%u", hr->hrm_index()), true), |
843 _code_roots(), _other_regions(hr, &_m), _iter_state(Unclaimed), _iter_claimed(0) { | 843 _code_roots(), _other_regions(hr, &_m), _iter_state(Unclaimed), _iter_claimed(0) { |
844 reset_for_par_iteration(); | 844 reset_for_par_iteration(); |
845 } | 845 } |
846 | 846 |
847 void HeapRegionRemSet::setup_remset_size() { | 847 void HeapRegionRemSet::setup_remset_size() { |