mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
6711316: Open source the Garbage-First garbage collector
First mercurial integration of the code for the Garbage-First garbage collector. Reviewed-by: apetrusenko, iveresov, jmasa, sgoldman, tonyp, ysr
This commit is contained in:
parent
39463bb3fc
commit
18f3386a98
215 changed files with 36088 additions and 1249 deletions
|
@ -54,6 +54,7 @@ class CardTableModRefBS: public ModRefBarrierSet {
|
|||
clean_card = -1,
|
||||
dirty_card = 0,
|
||||
precleaned_card = 1,
|
||||
claimed_card = 3,
|
||||
last_card = 4,
|
||||
CT_MR_BS_last_reserved = 10
|
||||
};
|
||||
|
@ -150,17 +151,6 @@ class CardTableModRefBS: public ModRefBarrierSet {
|
|||
return byte_for(p) + 1;
|
||||
}
|
||||
|
||||
// Mapping from card marking array entry to address of first word
|
||||
HeapWord* addr_for(const jbyte* p) const {
|
||||
assert(p >= _byte_map && p < _byte_map + _byte_map_size,
|
||||
"out of bounds access to card marking array");
|
||||
size_t delta = pointer_delta(p, byte_map_base, sizeof(jbyte));
|
||||
HeapWord* result = (HeapWord*) (delta << card_shift);
|
||||
assert(_whole_heap.contains(result),
|
||||
"out of bounds accessor from card marking array");
|
||||
return result;
|
||||
}
|
||||
|
||||
// Iterate over the portion of the card-table which covers the given
|
||||
// region mr in the given space and apply cl to any dirty sub-regions
|
||||
// of mr. cl and dcto_cl must either be the same closure or cl must
|
||||
|
@ -263,16 +253,22 @@ public:
|
|||
card_size_in_words = card_size / sizeof(HeapWord)
|
||||
};
|
||||
|
||||
static int clean_card_val() { return clean_card; }
|
||||
static int dirty_card_val() { return dirty_card; }
|
||||
static int claimed_card_val() { return claimed_card; }
|
||||
static int precleaned_card_val() { return precleaned_card; }
|
||||
|
||||
// For RTTI simulation.
|
||||
BarrierSet::Name kind() { return BarrierSet::CardTableModRef; }
|
||||
bool is_a(BarrierSet::Name bsn) {
|
||||
return bsn == BarrierSet::CardTableModRef || bsn == BarrierSet::ModRef;
|
||||
return bsn == BarrierSet::CardTableModRef || ModRefBarrierSet::is_a(bsn);
|
||||
}
|
||||
|
||||
CardTableModRefBS(MemRegion whole_heap, int max_covered_regions);
|
||||
|
||||
// *** Barrier set functions.
|
||||
|
||||
bool has_write_ref_pre_barrier() { return false; }
|
||||
|
||||
inline bool write_ref_needs_barrier(void* field, oop new_val) {
|
||||
// Note that this assumes the perm gen is the highest generation
|
||||
// in the address space
|
||||
|
@ -315,11 +311,33 @@ public:
|
|||
|
||||
// *** Card-table-barrier-specific things.
|
||||
|
||||
inline void inline_write_ref_field_pre(void* field, oop newVal) {}
|
||||
|
||||
inline void inline_write_ref_field(void* field, oop newVal) {
|
||||
jbyte* byte = byte_for(field);
|
||||
*byte = dirty_card;
|
||||
}
|
||||
|
||||
// These are used by G1, when it uses the card table as a temporary data
|
||||
// structure for card claiming.
|
||||
bool is_card_dirty(size_t card_index) {
|
||||
return _byte_map[card_index] == dirty_card_val();
|
||||
}
|
||||
|
||||
void mark_card_dirty(size_t card_index) {
|
||||
_byte_map[card_index] = dirty_card_val();
|
||||
}
|
||||
|
||||
bool is_card_claimed(size_t card_index) {
|
||||
return _byte_map[card_index] == claimed_card_val();
|
||||
}
|
||||
|
||||
bool claim_card(size_t card_index);
|
||||
|
||||
bool is_card_clean(size_t card_index) {
|
||||
return _byte_map[card_index] == clean_card_val();
|
||||
}
|
||||
|
||||
// Card marking array base (adjusted for heap low boundary)
|
||||
// This would be the 0th element of _byte_map, if the heap started at 0x0.
|
||||
// But since the heap starts at some higher address, this points to somewhere
|
||||
|
@ -344,8 +362,9 @@ public:
|
|||
}
|
||||
|
||||
// ModRefBS functions.
|
||||
void invalidate(MemRegion mr);
|
||||
virtual void invalidate(MemRegion mr, bool whole_heap = false);
|
||||
void clear(MemRegion mr);
|
||||
void dirty(MemRegion mr);
|
||||
void mod_oop_in_space_iterate(Space* sp, OopClosure* cl,
|
||||
bool clear = false,
|
||||
bool before_save_marks = false);
|
||||
|
@ -375,18 +394,39 @@ public:
|
|||
|
||||
static uintx ct_max_alignment_constraint();
|
||||
|
||||
// Apply closure cl to the dirty cards lying completely
|
||||
// within MemRegion mr, setting the cards to precleaned.
|
||||
void dirty_card_iterate(MemRegion mr, MemRegionClosure* cl);
|
||||
// Apply closure "cl" to the dirty cards containing some part of
|
||||
// MemRegion "mr".
|
||||
void dirty_card_iterate(MemRegion mr, MemRegionClosure* cl);
|
||||
|
||||
// Return the MemRegion corresponding to the first maximal run
|
||||
// of dirty cards lying completely within MemRegion mr, after
|
||||
// marking those cards precleaned.
|
||||
MemRegion dirty_card_range_after_preclean(MemRegion mr);
|
||||
// of dirty cards lying completely within MemRegion mr.
|
||||
// If reset is "true", then sets those card table entries to the given
|
||||
// value.
|
||||
MemRegion dirty_card_range_after_reset(MemRegion mr, bool reset,
|
||||
int reset_val);
|
||||
|
||||
// Set all the dirty cards in the given region to precleaned state.
|
||||
void preclean_dirty_cards(MemRegion mr);
|
||||
|
||||
// Provide read-only access to the card table array.
|
||||
const jbyte* byte_for_const(const void* p) const {
|
||||
return byte_for(p);
|
||||
}
|
||||
const jbyte* byte_after_const(const void* p) const {
|
||||
return byte_after(p);
|
||||
}
|
||||
|
||||
// Mapping from card marking array entry to address of first word
|
||||
HeapWord* addr_for(const jbyte* p) const {
|
||||
assert(p >= _byte_map && p < _byte_map + _byte_map_size,
|
||||
"out of bounds access to card marking array");
|
||||
size_t delta = pointer_delta(p, byte_map_base, sizeof(jbyte));
|
||||
HeapWord* result = (HeapWord*) (delta << card_shift);
|
||||
assert(_whole_heap.contains(result),
|
||||
"out of bounds accessor from card marking array");
|
||||
return result;
|
||||
}
|
||||
|
||||
// Mapping from address to card marking array index.
|
||||
int index_for(void* p) {
|
||||
assert(_whole_heap.contains(p),
|
||||
|
@ -402,6 +442,7 @@ public:
|
|||
static size_t par_chunk_heapword_alignment() {
|
||||
return CardsPerStrideChunk * card_size_in_words;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class CardTableRS;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue