Mercurial > hg > truffle
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(); } |