comparison src/share/vm/gc_implementation/g1/heapRegion.hpp @ 1021:1f19207eefc2

6847956: G1: crash in oopDesc*G1ParCopyHelper::copy_to_survivor_space(oopDesc*) Summary: When we copy objects to survivors during marking, we incorrectly set NTAMS to bottom, which causes marking to miss visiting some of those objects. Reviewed-by: apetrusenko, iveresov
author tonyp
date Mon, 05 Oct 2009 12:05:48 -0400
parents ff2402f6a50b
children 1316cec51b4d
comparison
equal deleted inserted replaced
1020:ff2402f6a50b 1021:1f19207eefc2
567 // After an evacuation, we need to update _next_top_at_mark_start 567 // After an evacuation, we need to update _next_top_at_mark_start
568 // to be the current top. Note this is only valid if we have only 568 // to be the current top. Note this is only valid if we have only
569 // ever evacuated into this region. If we evacuate, allocate, and 569 // ever evacuated into this region. If we evacuate, allocate, and
570 // then evacuate we are in deep doodoo. 570 // then evacuate we are in deep doodoo.
571 void note_end_of_copying() { 571 void note_end_of_copying() {
572 assert(top() >= _next_top_at_mark_start, 572 assert(top() >= _next_top_at_mark_start, "Increase only");
573 "Increase only"); 573 _next_top_at_mark_start = top();
574 // Survivor regions will be scanned on the start of concurrent
575 // marking.
576 if (!is_survivor()) {
577 _next_top_at_mark_start = top();
578 }
579 } 574 }
580 575
581 // Returns "false" iff no object in the region was allocated when the 576 // Returns "false" iff no object in the region was allocated when the
582 // last mark phase ended. 577 // last mark phase ended.
583 bool is_marked() { return _prev_top_at_mark_start != bottom(); } 578 bool is_marked() { return _prev_top_at_mark_start != bottom(); }