hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
changeset 21563 ccbd86010788
parent 21561 c619b1cb4554
child 21767 41eaa9a17059
equal deleted inserted replaced
21562:f3f6ea8474d0 21563:ccbd86010788
  6654   template <class T> void do_oop_work(T* p) {
  6654   template <class T> void do_oop_work(T* p) {
  6655     T heap_oop = oopDesc::load_heap_oop(p);
  6655     T heap_oop = oopDesc::load_heap_oop(p);
  6656     if (!oopDesc::is_null(heap_oop)) {
  6656     if (!oopDesc::is_null(heap_oop)) {
  6657       oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  6657       oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  6658       HeapRegion* hr = _g1h->heap_region_containing(obj);
  6658       HeapRegion* hr = _g1h->heap_region_containing(obj);
  6659       assert(!hr->isHumongous(), "code root in humongous region?");
  6659       assert(!hr->continuesHumongous(),
       
  6660              err_msg("trying to add code root "PTR_FORMAT" in continuation of humongous region "HR_FORMAT
       
  6661                      " starting at "HR_FORMAT,
       
  6662                      _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region())));
  6660 
  6663 
  6661       // HeapRegion::add_strong_code_root() avoids adding duplicate
  6664       // HeapRegion::add_strong_code_root() avoids adding duplicate
  6662       // entries but having duplicates is  OK since we "mark" nmethods
  6665       // entries but having duplicates is  OK since we "mark" nmethods
  6663       // as visited when we scan the strong code root lists during the GC.
  6666       // as visited when we scan the strong code root lists during the GC.
  6664       hr->add_strong_code_root(_nm);
  6667       hr->add_strong_code_root(_nm);
  6665       assert(hr->rem_set()->strong_code_roots_list_contains(_nm), "add failed?");
  6668       assert(hr->rem_set()->strong_code_roots_list_contains(_nm),
       
  6669              err_msg("failed to add code root "PTR_FORMAT" to remembered set of region "HR_FORMAT,
       
  6670                      _nm, HR_FORMAT_PARAMS(hr)));
  6666     }
  6671     }
  6667   }
  6672   }
  6668 
  6673 
  6669 public:
  6674 public:
  6670   RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
  6675   RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
  6681   template <class T> void do_oop_work(T* p) {
  6686   template <class T> void do_oop_work(T* p) {
  6682     T heap_oop = oopDesc::load_heap_oop(p);
  6687     T heap_oop = oopDesc::load_heap_oop(p);
  6683     if (!oopDesc::is_null(heap_oop)) {
  6688     if (!oopDesc::is_null(heap_oop)) {
  6684       oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  6689       oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
  6685       HeapRegion* hr = _g1h->heap_region_containing(obj);
  6690       HeapRegion* hr = _g1h->heap_region_containing(obj);
  6686       assert(!hr->isHumongous(), "code root in humongous region?");
  6691       assert(!hr->continuesHumongous(),
       
  6692              err_msg("trying to remove code root "PTR_FORMAT" in continuation of humongous region "HR_FORMAT
       
  6693                      " starting at "HR_FORMAT,
       
  6694                      _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region())));
       
  6695 
  6687       hr->remove_strong_code_root(_nm);
  6696       hr->remove_strong_code_root(_nm);
  6688       assert(!hr->rem_set()->strong_code_roots_list_contains(_nm), "remove failed?");
  6697       assert(!hr->rem_set()->strong_code_roots_list_contains(_nm),
       
  6698              err_msg("failed to remove code root "PTR_FORMAT" of region "HR_FORMAT,
       
  6699                      _nm, HR_FORMAT_PARAMS(hr)));
  6689     }
  6700     }
  6690   }
  6701   }
  6691 
  6702 
  6692 public:
  6703 public:
  6693   UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
  6704   UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
  6714 }
  6725 }
  6715 
  6726 
  6716 class MigrateCodeRootsHeapRegionClosure: public HeapRegionClosure {
  6727 class MigrateCodeRootsHeapRegionClosure: public HeapRegionClosure {
  6717 public:
  6728 public:
  6718   bool doHeapRegion(HeapRegion *hr) {
  6729   bool doHeapRegion(HeapRegion *hr) {
  6719     assert(!hr->isHumongous(), "humongous region in collection set?");
  6730     assert(!hr->isHumongous(),
       
  6731            err_msg("humongous region "HR_FORMAT" should not have been added to collection set",
       
  6732                    HR_FORMAT_PARAMS(hr)));
  6720     hr->migrate_strong_code_roots();
  6733     hr->migrate_strong_code_roots();
  6721     return false;
  6734     return false;
  6722   }
  6735   }
  6723 };
  6736 };
  6724 
  6737 
  6794   MarkStrongCodeRootsHRClosure(G1CollectedHeap* g1h, uint worker_id) :
  6807   MarkStrongCodeRootsHRClosure(G1CollectedHeap* g1h, uint worker_id) :
  6795     _g1h(g1h), _worker_id(worker_id) {}
  6808     _g1h(g1h), _worker_id(worker_id) {}
  6796 
  6809 
  6797   bool doHeapRegion(HeapRegion *hr) {
  6810   bool doHeapRegion(HeapRegion *hr) {
  6798     HeapRegionRemSet* hrrs = hr->rem_set();
  6811     HeapRegionRemSet* hrrs = hr->rem_set();
  6799     if (hr->isHumongous()) {
  6812     if (hr->continuesHumongous()) {
  6800       // Code roots should never be attached to a humongous region
  6813       // Code roots should never be attached to a continuation of a humongous region
  6801       assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
  6814       assert(hrrs->strong_code_roots_list_length() == 0,
       
  6815              err_msg("code roots should never be attached to continuations of humongous region "HR_FORMAT
       
  6816                      " starting at "HR_FORMAT", but has "INT32_FORMAT,
       
  6817                      HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region()),
       
  6818                      hrrs->strong_code_roots_list_length()));
  6802       return false;
  6819       return false;
  6803     }
  6820     }
  6804 
  6821 
  6805     if (hr->in_collection_set()) {
  6822     if (hr->in_collection_set()) {
  6806       // Don't mark code roots into regions in the collection set here.
  6823       // Don't mark code roots into regions in the collection set here.