1.1 --- a/src/share/vm/memory/defNewGeneration.cpp Fri Dec 17 11:26:53 2010 -0800 1.2 +++ b/src/share/vm/memory/defNewGeneration.cpp Fri Dec 17 23:41:31 2010 -0800 1.3 @@ -684,23 +684,28 @@ 1.4 _preserved_marks_of_objs.clear(true); 1.5 } 1.6 1.7 +void DefNewGeneration::preserve_mark(oop obj, markOop m) { 1.8 + assert(promotion_failed() && m->must_be_preserved_for_promotion_failure(obj), 1.9 + "Oversaving!"); 1.10 + _objs_with_preserved_marks.push(obj); 1.11 + _preserved_marks_of_objs.push(m); 1.12 +} 1.13 + 1.14 void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) { 1.15 if (m->must_be_preserved_for_promotion_failure(obj)) { 1.16 - _objs_with_preserved_marks.push(obj); 1.17 - _preserved_marks_of_objs.push(m); 1.18 + preserve_mark(obj, m); 1.19 } 1.20 } 1.21 1.22 void DefNewGeneration::handle_promotion_failure(oop old) { 1.23 - preserve_mark_if_necessary(old, old->mark()); 1.24 - if (!_promotion_failed && PrintPromotionFailure) { 1.25 + if (PrintPromotionFailure && !_promotion_failed) { 1.26 gclog_or_tty->print(" (promotion failure size = " SIZE_FORMAT ") ", 1.27 old->size()); 1.28 } 1.29 - 1.30 + _promotion_failed = true; 1.31 + preserve_mark_if_necessary(old, old->mark()); 1.32 // forward to self 1.33 old->forward_to(old); 1.34 - _promotion_failed = true; 1.35 1.36 _promo_failure_scan_stack.push(old); 1.37