Mercurial > hg > truffle
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) { |