8055091: CollectedHeap::_reserved usage should be cleaned up

Added an initialization function for _reserved.

Reviewed-by: mgerdin, jwilhelm
This commit is contained in:
Marcus Larsson 2014-09-18 12:45:45 +02:00
parent bc07a22d12
commit f6ab247c45
6 changed files with 21 additions and 24 deletions

View file

@ -1960,15 +1960,10 @@ jint G1CollectedHeap::initialize() {
ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size, ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size,
heap_alignment); heap_alignment);
// It is important to do this in a way such that concurrent readers can't initialize_reserved_region((HeapWord*)heap_rs.base(), (HeapWord*)(heap_rs.base() + heap_rs.size()));
// temporarily think something is in the heap. (I've actually seen this
// happen in asserts: DLD.)
_reserved.set_word_size(0);
_reserved.set_start((HeapWord*)heap_rs.base());
_reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
// Create the gen rem set (and barrier set) for the entire reserved region. // Create the gen rem set (and barrier set) for the entire reserved region.
_rem_set = collector_policy()->create_rem_set(_reserved, 2); _rem_set = collector_policy()->create_rem_set(reserved_region(), 2);
set_barrier_set(rem_set()->bs()); set_barrier_set(rem_set()->bs());
if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) { if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) {
vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS"); vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS");
@ -2052,7 +2047,7 @@ jint G1CollectedHeap::initialize() {
FreeRegionList::set_unrealistically_long_length(max_regions() + 1); FreeRegionList::set_unrealistically_long_length(max_regions() + 1);
_bot_shared = new G1BlockOffsetSharedArray(_reserved, bot_storage); _bot_shared = new G1BlockOffsetSharedArray(reserved_region(), bot_storage);
_g1h = this; _g1h = this;

View file

@ -43,8 +43,8 @@ inline HeapRegion* G1CollectedHeap::region_at(uint index) const { return _hrm.at
inline uint G1CollectedHeap::addr_to_region(HeapWord* addr) const { inline uint G1CollectedHeap::addr_to_region(HeapWord* addr) const {
assert(is_in_reserved(addr), assert(is_in_reserved(addr),
err_msg("Cannot calculate region index for address "PTR_FORMAT" that is outside of the heap ["PTR_FORMAT", "PTR_FORMAT")", err_msg("Cannot calculate region index for address "PTR_FORMAT" that is outside of the heap ["PTR_FORMAT", "PTR_FORMAT")",
p2i(addr), p2i(_reserved.start()), p2i(_reserved.end()))); p2i(addr), p2i(reserved_region().start()), p2i(reserved_region().end())));
return (uint)(pointer_delta(addr, _reserved.start(), sizeof(uint8_t)) >> HeapRegion::LogOfHRGrainBytes); return (uint)(pointer_delta(addr, reserved_region().start(), sizeof(uint8_t)) >> HeapRegion::LogOfHRGrainBytes);
} }
inline HeapWord* G1CollectedHeap::bottom_addr_for_region(uint index) const { inline HeapWord* G1CollectedHeap::bottom_addr_for_region(uint index) const {

View file

@ -74,10 +74,9 @@ jint ParallelScavengeHeap::initialize() {
return JNI_ENOMEM; return JNI_ENOMEM;
} }
_reserved = MemRegion((HeapWord*)heap_rs.base(), initialize_reserved_region((HeapWord*)heap_rs.base(), (HeapWord*)(heap_rs.base() + heap_rs.size()));
(HeapWord*)(heap_rs.base() + heap_rs.size()));
CardTableExtension* const barrier_set = new CardTableExtension(_reserved, 3); CardTableExtension* const barrier_set = new CardTableExtension(reserved_region(), 3);
barrier_set->initialize(); barrier_set->initialize();
_barrier_set = barrier_set; _barrier_set = barrier_set;
oopDesc::set_bs(_barrier_set); oopDesc::set_bs(_barrier_set);

View file

@ -582,6 +582,14 @@ void CollectedHeap::post_full_gc_dump(GCTimer* timer) {
} }
} }
void CollectedHeap::initialize_reserved_region(HeapWord *start, HeapWord *end) {
// It is important to do this in a way such that concurrent readers can't
// temporarily think something is in the heap. (Seen this happen in asserts.)
_reserved.set_word_size(0);
_reserved.set_start(start);
_reserved.set_end(end);
}
/////////////// Unit tests /////////////// /////////////// Unit tests ///////////////
#ifndef PRODUCT #ifndef PRODUCT

View file

@ -85,6 +85,7 @@ class CollectedHeap : public CHeapObj<mtInternal> {
friend class VMStructs; friend class VMStructs;
friend class IsGCActiveMark; // Block structured external access to _is_gc_active friend class IsGCActiveMark; // Block structured external access to _is_gc_active
private:
#ifdef ASSERT #ifdef ASSERT
static int _fire_out_of_memory_count; static int _fire_out_of_memory_count;
#endif #endif
@ -97,8 +98,9 @@ class CollectedHeap : public CHeapObj<mtInternal> {
// Used in support of ReduceInitialCardMarks; only consulted if COMPILER2 is being used // Used in support of ReduceInitialCardMarks; only consulted if COMPILER2 is being used
bool _defer_initial_card_mark; bool _defer_initial_card_mark;
protected:
MemRegion _reserved; MemRegion _reserved;
protected:
BarrierSet* _barrier_set; BarrierSet* _barrier_set;
bool _is_gc_active; bool _is_gc_active;
uint _n_par_threads; uint _n_par_threads;
@ -211,6 +213,7 @@ class CollectedHeap : public CHeapObj<mtInternal> {
// Stop any onging concurrent work and prepare for exit. // Stop any onging concurrent work and prepare for exit.
virtual void stop() {} virtual void stop() {}
void initialize_reserved_region(HeapWord *start, HeapWord *end);
MemRegion reserved_region() const { return _reserved; } MemRegion reserved_region() const { return _reserved; }
address base() const { return (address)reserved_region().start(); } address base() const { return (address)reserved_region().start(); }

View file

@ -123,17 +123,9 @@ jint GenCollectedHeap::initialize() {
return JNI_ENOMEM; return JNI_ENOMEM;
} }
_reserved = MemRegion((HeapWord*)heap_rs.base(), initialize_reserved_region((HeapWord*)heap_rs.base(), (HeapWord*)(heap_rs.base() + heap_rs.size()));
(HeapWord*)(heap_rs.base() + heap_rs.size()));
// It is important to do this in a way such that concurrent readers can't _rem_set = collector_policy()->create_rem_set(reserved_region(), n_covered_regions);
// temporarily think something is in the heap. (Seen this happen in asserts.)
_reserved.set_word_size(0);
_reserved.set_start((HeapWord*)heap_rs.base());
size_t actual_heap_size = heap_rs.size();
_reserved.set_end((HeapWord*)(heap_rs.base() + actual_heap_size));
_rem_set = collector_policy()->create_rem_set(_reserved, n_covered_regions);
set_barrier_set(rem_set()->bs()); set_barrier_set(rem_set()->bs());
_gch = this; _gch = this;