提交 368eed82 编写于 作者: I iveresov

6758633: G1: SEGV with GCOld on Linux

Summary: Avoid growth of a GrowableArray backend of HeapRegionSeq.
Reviewed-by: tonyp, jcoomes
上级 fd7608b0
...@@ -1398,7 +1398,7 @@ jint G1CollectedHeap::initialize() { ...@@ -1398,7 +1398,7 @@ jint G1CollectedHeap::initialize() {
_g1_storage.initialize(g1_rs, 0); _g1_storage.initialize(g1_rs, 0);
_g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0); _g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
_g1_max_committed = _g1_committed; _g1_max_committed = _g1_committed;
_hrs = new HeapRegionSeq(); _hrs = new HeapRegionSeq(_expansion_regions);
guarantee(_hrs != NULL, "Couldn't allocate HeapRegionSeq"); guarantee(_hrs != NULL, "Couldn't allocate HeapRegionSeq");
guarantee(_cur_alloc_region == NULL, "from constructor"); guarantee(_cur_alloc_region == NULL, "from constructor");
......
...@@ -37,7 +37,7 @@ static int orderRegions(HeapRegion** hr1p, HeapRegion** hr2p) { ...@@ -37,7 +37,7 @@ static int orderRegions(HeapRegion** hr1p, HeapRegion** hr2p) {
return 0; return 0;
} }
HeapRegionSeq::HeapRegionSeq() : HeapRegionSeq::HeapRegionSeq(const size_t max_size) :
_alloc_search_start(0), _alloc_search_start(0),
// The line below is the worst bit of C++ hackery I've ever written // 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 // (Detlefs, 11/23). You should think of it as equivalent to
...@@ -50,7 +50,7 @@ HeapRegionSeq::HeapRegionSeq() : ...@@ -50,7 +50,7 @@ HeapRegionSeq::HeapRegionSeq() :
_regions((ResourceObj::operator new (sizeof(GrowableArray<HeapRegion*>), _regions((ResourceObj::operator new (sizeof(GrowableArray<HeapRegion*>),
(void*)&_regions, (void*)&_regions,
ResourceObj::C_HEAP), ResourceObj::C_HEAP),
100), (int)max_size),
true), true),
_next_rr_candidate(0), _next_rr_candidate(0),
_seq_bottom(NULL) _seq_bottom(NULL)
...@@ -167,6 +167,7 @@ int HeapRegionSeq::find(HeapRegion* hr) { ...@@ -167,6 +167,7 @@ int HeapRegionSeq::find(HeapRegion* hr) {
// Public methods. // Public methods.
void HeapRegionSeq::insert(HeapRegion* hr) { void HeapRegionSeq::insert(HeapRegion* hr) {
assert(!_regions.is_full(), "Too many elements in HeapRegionSeq");
if (_regions.length() == 0 if (_regions.length() == 0
|| _regions.top()->end() <= hr->bottom()) { || _regions.top()->end() <= hr->bottom()) {
hr->set_hrs_index(_regions.length()); hr->set_hrs_index(_regions.length());
......
...@@ -49,7 +49,7 @@ class HeapRegionSeq: public CHeapObj { ...@@ -49,7 +49,7 @@ class HeapRegionSeq: public CHeapObj {
public: public:
// Initializes "this" to the empty sequence of regions. // 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 // Adds "hr" to "this" sequence. Requires "hr" not to overlap with
// any region already in "this". (Will perform better if regions are // any region already in "this". (Will perform better if regions are
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册