提交 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() {
_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");
......
......@@ -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());
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册