1.1 --- a/src/share/vm/memory/defNewGeneration.cpp Tue Sep 28 09:51:37 2010 -0700 1.2 +++ b/src/share/vm/memory/defNewGeneration.cpp Tue Sep 28 15:56:15 2010 -0700 1.3 @@ -87,9 +87,7 @@ 1.4 _gch->oop_since_save_marks_iterate(_level, _scan_cur_or_nonheap, 1.5 _scan_older); 1.6 } while (!_gch->no_allocs_since_save_marks(_level)); 1.7 - guarantee(_gen->promo_failure_scan_stack() == NULL 1.8 - || _gen->promo_failure_scan_stack()->length() == 0, 1.9 - "Failed to finish scan"); 1.10 + guarantee(_gen->promo_failure_scan_is_complete(), "Failed to finish scan"); 1.11 } 1.12 1.13 ScanClosure::ScanClosure(DefNewGeneration* g, bool gc_barrier) : 1.14 @@ -130,9 +128,6 @@ 1.15 int level, 1.16 const char* policy) 1.17 : Generation(rs, initial_size, level), 1.18 - _objs_with_preserved_marks(NULL), 1.19 - _preserved_marks_of_objs(NULL), 1.20 - _promo_failure_scan_stack(NULL), 1.21 _promo_failure_drain_in_progress(false), 1.22 _should_allocate_from_space(false) 1.23 { 1.24 @@ -604,12 +599,8 @@ 1.25 } else { 1.26 assert(HandlePromotionFailure, 1.27 "Should not be here unless promotion failure handling is on"); 1.28 - assert(_promo_failure_scan_stack != NULL && 1.29 - _promo_failure_scan_stack->length() == 0, "post condition"); 1.30 - 1.31 - // deallocate stack and it's elements 1.32 - delete _promo_failure_scan_stack; 1.33 - _promo_failure_scan_stack = NULL; 1.34 + assert(_promo_failure_scan_stack.is_empty(), "post condition"); 1.35 + _promo_failure_scan_stack.clear(true); // Clear cached segments. 1.36 1.37 remove_forwarding_pointers(); 1.38 if (PrintGCDetails) { 1.39 @@ -620,7 +611,7 @@ 1.40 // case there can be live objects in to-space 1.41 // as a result of a partial evacuation of eden 1.42 // and from-space. 1.43 - swap_spaces(); // For the sake of uniformity wrt ParNewGeneration::collect(). 1.44 + swap_spaces(); // For uniformity wrt ParNewGeneration. 1.45 from()->set_next_compaction_space(to()); 1.46 gch->set_incremental_collection_will_fail(); 1.47 1.48 @@ -653,34 +644,23 @@ 1.49 RemoveForwardPointerClosure rspc; 1.50 eden()->object_iterate(&rspc); 1.51 from()->object_iterate(&rspc); 1.52 + 1.53 // Now restore saved marks, if any. 1.54 - if (_objs_with_preserved_marks != NULL) { 1.55 - assert(_preserved_marks_of_objs != NULL, "Both or none."); 1.56 - assert(_objs_with_preserved_marks->length() == 1.57 - _preserved_marks_of_objs->length(), "Both or none."); 1.58 - for (int i = 0; i < _objs_with_preserved_marks->length(); i++) { 1.59 - oop obj = _objs_with_preserved_marks->at(i); 1.60 - markOop m = _preserved_marks_of_objs->at(i); 1.61 - obj->set_mark(m); 1.62 - } 1.63 - delete _objs_with_preserved_marks; 1.64 - delete _preserved_marks_of_objs; 1.65 - _objs_with_preserved_marks = NULL; 1.66 - _preserved_marks_of_objs = NULL; 1.67 + assert(_objs_with_preserved_marks.size() == _preserved_marks_of_objs.size(), 1.68 + "should be the same"); 1.69 + while (!_objs_with_preserved_marks.is_empty()) { 1.70 + oop obj = _objs_with_preserved_marks.pop(); 1.71 + markOop m = _preserved_marks_of_objs.pop(); 1.72 + obj->set_mark(m); 1.73 } 1.74 + _objs_with_preserved_marks.clear(true); 1.75 + _preserved_marks_of_objs.clear(true); 1.76 } 1.77 1.78 void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) { 1.79 if (m->must_be_preserved_for_promotion_failure(obj)) { 1.80 - if (_objs_with_preserved_marks == NULL) { 1.81 - assert(_preserved_marks_of_objs == NULL, "Both or none."); 1.82 - _objs_with_preserved_marks = new (ResourceObj::C_HEAP) 1.83 - GrowableArray<oop>(PreserveMarkStackSize, true); 1.84 - _preserved_marks_of_objs = new (ResourceObj::C_HEAP) 1.85 - GrowableArray<markOop>(PreserveMarkStackSize, true); 1.86 - } 1.87 - _objs_with_preserved_marks->push(obj); 1.88 - _preserved_marks_of_objs->push(m); 1.89 + _objs_with_preserved_marks.push(obj); 1.90 + _preserved_marks_of_objs.push(m); 1.91 } 1.92 } 1.93 1.94 @@ -695,7 +675,7 @@ 1.95 old->forward_to(old); 1.96 _promotion_failed = true; 1.97 1.98 - push_on_promo_failure_scan_stack(old); 1.99 + _promo_failure_scan_stack.push(old); 1.100 1.101 if (!_promo_failure_drain_in_progress) { 1.102 // prevent recursion in copy_to_survivor_space() 1.103 @@ -748,20 +728,9 @@ 1.104 return obj; 1.105 } 1.106 1.107 -void DefNewGeneration::push_on_promo_failure_scan_stack(oop obj) { 1.108 - if (_promo_failure_scan_stack == NULL) { 1.109 - _promo_failure_scan_stack = new (ResourceObj::C_HEAP) 1.110 - GrowableArray<oop>(40, true); 1.111 - } 1.112 - 1.113 - _promo_failure_scan_stack->push(obj); 1.114 -} 1.115 - 1.116 void DefNewGeneration::drain_promo_failure_scan_stack() { 1.117 - assert(_promo_failure_scan_stack != NULL, "precondition"); 1.118 - 1.119 - while (_promo_failure_scan_stack->length() > 0) { 1.120 - oop obj = _promo_failure_scan_stack->pop(); 1.121 + while (!_promo_failure_scan_stack.is_empty()) { 1.122 + oop obj = _promo_failure_scan_stack.pop(); 1.123 obj->oop_iterate(_promo_failure_scan_stack_closure); 1.124 } 1.125 }