src/share/vm/gc_implementation/g1/heapRegion.hpp
Print this page
rev 4802 : imported patch optimize-nmethod-scanning
*** 50,59 ****
--- 50,60 ----
class ContiguousSpace;
class HeapRegionRemSet;
class HeapRegionRemSetIterator;
class HeapRegion;
class HeapRegionSetBase;
+ class nmethod;
#define HR_FORMAT "%u:(%s)["PTR_FORMAT","PTR_FORMAT","PTR_FORMAT"]"
#define HR_FORMAT_PARAMS(_hr_) \
(_hr_)->hrs_index(), \
(_hr_)->is_survivor() ? "S" : (_hr_)->is_young() ? "E" : \
*** 335,344 ****
--- 336,348 ----
// The predicted number of bytes to copy that was added to
// the total value for the collection set.
size_t _predicted_bytes_to_copy;
+ // A list of code blobs (nmethods) whose code contains pointers into this region
+ GrowableArray<nmethod*>* _strong_code_root_list;
+
public:
HeapRegion(uint hrs_index,
G1BlockOffsetSharedArray* sharedOffsetArray,
MemRegion mr);
*** 369,379 ****
ScrubRemSetClaimValue = 3,
ParVerifyClaimValue = 4,
RebuildRSClaimValue = 5,
ParEvacFailureClaimValue = 6,
AggregateCountClaimValue = 7,
! VerifyCountClaimValue = 8
};
inline HeapWord* par_allocate_no_bot_updates(size_t word_size) {
assert(is_young(), "we can only skip BOT updates on young regions");
return ContiguousSpace::par_allocate(word_size);
--- 373,384 ----
ScrubRemSetClaimValue = 3,
ParVerifyClaimValue = 4,
RebuildRSClaimValue = 5,
ParEvacFailureClaimValue = 6,
AggregateCountClaimValue = 7,
! VerifyCountClaimValue = 8,
! ParMarkRootClaimValue = 9
};
inline HeapWord* par_allocate_no_bot_updates(size_t word_size) {
assert(is_young(), "we can only skip BOT updates on young regions");
return ContiguousSpace::par_allocate(word_size);
*** 794,803 ****
--- 799,835 ----
virtual CompactibleSpace* next_compaction_space() const;
virtual void reset_after_compaction();
+ // Routines for managing the list of code roots that point into
+ // this heap region.
+ void add_strong_code_root(nmethod* nm);
+ void remove_strong_code_root(nmethod* nm);
+
+ GrowableArray<nmethod*>* strong_code_root_list() {
+ return _strong_code_root_list;
+ }
+
+ // During a collection, migrate successfully evacuated strong
+ // code roots attached to this region to the new regions that
+ // they point into. Unsuccessfully evacuated code roots are
+ // not migrated.
+ void migrate_strong_code_roots();
+
+ // Applies blk->do_code_blob() to each of the entries in
+ // the strong code roots list;
+ void strong_code_roots_do(CodeBlobClosure* blk) const;
+
+ // Returns the amount of memory, in bytes, currently
+ // consumed by the strong code roots.
+ size_t strong_code_root_mem_size();
+
+ // Verify that the entries on the strong code root list are live and
+ // include at least one pointer into this region.
+ void verify_strong_code_roots(VerifyOption vo, bool* failures) const;
+
void print() const;
void print_on(outputStream* st) const;
// vo == UsePrevMarking -> use "prev" marking information,
// vo == UseNextMarking -> use "next" marking information