comparison src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 8038:ad747ee9d0b1

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
author brutisso
date Sun, 10 Feb 2013 21:15:16 +0100
parents 0b54ffe4c2d3
children c3657d00e343 2e093b564241
comparison
equal deleted inserted replaced
8037:9425ba04792d 8038:ad747ee9d0b1
1891 _is_alive_closure_stw(this), 1891 _is_alive_closure_stw(this),
1892 _ref_processor_cm(NULL), 1892 _ref_processor_cm(NULL),
1893 _ref_processor_stw(NULL), 1893 _ref_processor_stw(NULL),
1894 _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)), 1894 _process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
1895 _bot_shared(NULL), 1895 _bot_shared(NULL),
1896 _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
1897 _evac_failure_scan_stack(NULL) , 1896 _evac_failure_scan_stack(NULL) ,
1898 _mark_in_progress(false), 1897 _mark_in_progress(false),
1899 _cg1r(NULL), _summary_bytes_used(0), 1898 _cg1r(NULL), _summary_bytes_used(0),
1900 _g1mm(NULL), 1899 _g1mm(NULL),
1901 _refine_cte_cl(NULL), 1900 _refine_cte_cl(NULL),
4213 reset_cset_heap_region_claim_values(); 4212 reset_cset_heap_region_claim_values();
4214 4213
4215 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity"); 4214 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
4216 4215
4217 // Now restore saved marks, if any. 4216 // Now restore saved marks, if any.
4218 if (_objs_with_preserved_marks != NULL) { 4217 assert(_objs_with_preserved_marks.size() ==
4219 assert(_preserved_marks_of_objs != NULL, "Both or none."); 4218 _preserved_marks_of_objs.size(), "Both or none.");
4220 guarantee(_objs_with_preserved_marks->length() == 4219 while (!_objs_with_preserved_marks.is_empty()) {
4221 _preserved_marks_of_objs->length(), "Both or none."); 4220 oop obj = _objs_with_preserved_marks.pop();
4222 for (int i = 0; i < _objs_with_preserved_marks->length(); i++) { 4221 markOop m = _preserved_marks_of_objs.pop();
4223 oop obj = _objs_with_preserved_marks->at(i); 4222 obj->set_mark(m);
4224 markOop m = _preserved_marks_of_objs->at(i); 4223 }
4225 obj->set_mark(m); 4224 _objs_with_preserved_marks.clear(true);
4226 } 4225 _preserved_marks_of_objs.clear(true);
4227
4228 // Delete the preserved marks growable arrays (allocated on the C heap).
4229 delete _objs_with_preserved_marks;
4230 delete _preserved_marks_of_objs;
4231 _objs_with_preserved_marks = NULL;
4232 _preserved_marks_of_objs = NULL;
4233 }
4234 } 4226 }
4235 4227
4236 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) { 4228 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
4237 _evac_failure_scan_stack->push(obj); 4229 _evac_failure_scan_stack->push(obj);
4238 } 4230 }
4311 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) { 4303 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
4312 assert(evacuation_failed(), "Oversaving!"); 4304 assert(evacuation_failed(), "Oversaving!");
4313 // We want to call the "for_promotion_failure" version only in the 4305 // We want to call the "for_promotion_failure" version only in the
4314 // case of a promotion failure. 4306 // case of a promotion failure.
4315 if (m->must_be_preserved_for_promotion_failure(obj)) { 4307 if (m->must_be_preserved_for_promotion_failure(obj)) {
4316 if (_objs_with_preserved_marks == NULL) { 4308 _objs_with_preserved_marks.push(obj);
4317 assert(_preserved_marks_of_objs == NULL, "Both or none."); 4309 _preserved_marks_of_objs.push(m);
4318 _objs_with_preserved_marks =
4319 new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
4320 _preserved_marks_of_objs =
4321 new (ResourceObj::C_HEAP, mtGC) GrowableArray<markOop>(40, true);
4322 }
4323 _objs_with_preserved_marks->push(obj);
4324 _preserved_marks_of_objs->push(m);
4325 } 4310 }
4326 } 4311 }
4327 4312
4328 HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose, 4313 HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose,
4329 size_t word_size) { 4314 size_t word_size) {