提交 669efc8c 编写于 作者: B brutisso

8002144: G1: large number of evacuation failures may lead to large c heap memory usage

Summary: Use Stack<> instead of GrowableArray to keep track of preserved marks. Also reviewed by vitalyd@gmail.com.
Reviewed-by: johnc, jcoomes
上级 8c8f83a3
...@@ -1893,7 +1893,6 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : ...@@ -1893,7 +1893,6 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
_ref_processor_stw(NULL), _ref_processor_stw(NULL),
_process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)), _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
_bot_shared(NULL), _bot_shared(NULL),
_objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
_evac_failure_scan_stack(NULL) , _evac_failure_scan_stack(NULL) ,
_mark_in_progress(false), _mark_in_progress(false),
_cg1r(NULL), _summary_bytes_used(0), _cg1r(NULL), _summary_bytes_used(0),
...@@ -4215,22 +4214,15 @@ void G1CollectedHeap::remove_self_forwarding_pointers() { ...@@ -4215,22 +4214,15 @@ void G1CollectedHeap::remove_self_forwarding_pointers() {
assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity"); assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
// Now restore saved marks, if any. // Now restore saved marks, if any.
if (_objs_with_preserved_marks != NULL) { assert(_objs_with_preserved_marks.size() ==
assert(_preserved_marks_of_objs != NULL, "Both or none."); _preserved_marks_of_objs.size(), "Both or none.");
guarantee(_objs_with_preserved_marks->length() == while (!_objs_with_preserved_marks.is_empty()) {
_preserved_marks_of_objs->length(), "Both or none."); oop obj = _objs_with_preserved_marks.pop();
for (int i = 0; i < _objs_with_preserved_marks->length(); i++) { markOop m = _preserved_marks_of_objs.pop();
oop obj = _objs_with_preserved_marks->at(i); obj->set_mark(m);
markOop m = _preserved_marks_of_objs->at(i);
obj->set_mark(m);
}
// Delete the preserved marks growable arrays (allocated on the C heap).
delete _objs_with_preserved_marks;
delete _preserved_marks_of_objs;
_objs_with_preserved_marks = NULL;
_preserved_marks_of_objs = NULL;
} }
_objs_with_preserved_marks.clear(true);
_preserved_marks_of_objs.clear(true);
} }
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) { void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
...@@ -4313,15 +4305,8 @@ void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) { ...@@ -4313,15 +4305,8 @@ void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
// We want to call the "for_promotion_failure" version only in the // We want to call the "for_promotion_failure" version only in the
// case of a promotion failure. // case of a promotion failure.
if (m->must_be_preserved_for_promotion_failure(obj)) { if (m->must_be_preserved_for_promotion_failure(obj)) {
if (_objs_with_preserved_marks == NULL) { _objs_with_preserved_marks.push(obj);
assert(_preserved_marks_of_objs == NULL, "Both or none."); _preserved_marks_of_objs.push(m);
_objs_with_preserved_marks =
new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
_preserved_marks_of_objs =
new (ResourceObj::C_HEAP, mtGC) GrowableArray<markOop>(40, true);
}
_objs_with_preserved_marks->push(obj);
_preserved_marks_of_objs->push(m);
} }
} }
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "memory/barrierSet.hpp" #include "memory/barrierSet.hpp"
#include "memory/memRegion.hpp" #include "memory/memRegion.hpp"
#include "memory/sharedHeap.hpp" #include "memory/sharedHeap.hpp"
#include "utilities/stack.hpp"
// A "G1CollectedHeap" is an implementation of a java heap for HotSpot. // A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
// It uses the "Garbage First" heap organization and algorithm, which // It uses the "Garbage First" heap organization and algorithm, which
...@@ -877,10 +878,9 @@ protected: ...@@ -877,10 +878,9 @@ protected:
// forwarding pointers to themselves. Reset them. // forwarding pointers to themselves. Reset them.
void remove_self_forwarding_pointers(); void remove_self_forwarding_pointers();
// When one is non-null, so is the other. Together, they each pair is // Together, these store an object with a preserved mark, and its mark value.
// an object with a preserved mark, and its mark value. Stack<oop, mtGC> _objs_with_preserved_marks;
GrowableArray<oop>* _objs_with_preserved_marks; Stack<markOop, mtGC> _preserved_marks_of_objs;
GrowableArray<markOop>* _preserved_marks_of_objs;
// Preserve the mark of "obj", if necessary, in preparation for its mark // Preserve the mark of "obj", if necessary, in preparation for its mark
// word being overwritten with a self-forwarding-pointer. // word being overwritten with a self-forwarding-pointer.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册