6758633: G1: SEGV with GCOld on Linux

Avoid growth of a GrowableArray backend of HeapRegionSeq.

Reviewed-by: tonyp, jcoomes
This commit is contained in:
Igor Veresov 2008-10-13 21:41:42 -07:00
parent 04b0ebb9c1
commit bc9f364917
3 changed files with 5 additions and 4 deletions

View File

@ -1398,7 +1398,7 @@ jint G1CollectedHeap::initialize() {
_g1_storage.initialize(g1_rs, 0);
_g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
_g1_max_committed = _g1_committed;
_hrs = new HeapRegionSeq();
_hrs = new HeapRegionSeq(_expansion_regions);
guarantee(_hrs != NULL, "Couldn't allocate HeapRegionSeq");
guarantee(_cur_alloc_region == NULL, "from constructor");

View File

@ -37,7 +37,7 @@ static int orderRegions(HeapRegion** hr1p, HeapRegion** hr2p) {
return 0;
}
HeapRegionSeq::HeapRegionSeq() :
HeapRegionSeq::HeapRegionSeq(const size_t max_size) :
_alloc_search_start(0),
// The line below is the worst bit of C++ hackery I've ever written
// (Detlefs, 11/23). You should think of it as equivalent to
@ -50,7 +50,7 @@ HeapRegionSeq::HeapRegionSeq() :
_regions((ResourceObj::operator new (sizeof(GrowableArray<HeapRegion*>),
(void*)&_regions,
ResourceObj::C_HEAP),
100),
(int)max_size),
true),
_next_rr_candidate(0),
_seq_bottom(NULL)
@ -167,6 +167,7 @@ int HeapRegionSeq::find(HeapRegion* hr) {
// Public methods.
void HeapRegionSeq::insert(HeapRegion* hr) {
assert(!_regions.is_full(), "Too many elements in HeapRegionSeq");
if (_regions.length() == 0
|| _regions.top()->end() <= hr->bottom()) {
hr->set_hrs_index(_regions.length());

View File

@ -49,7 +49,7 @@ class HeapRegionSeq: public CHeapObj {
public:
// Initializes "this" to the empty sequence of regions.
HeapRegionSeq();
HeapRegionSeq(const size_t max_size);
// Adds "hr" to "this" sequence. Requires "hr" not to overlap with
// any region already in "this". (Will perform better if regions are