< prev index next >
src/share/vm/gc/shared/space.inline.hpp
Print this page
*** 187,231 ****
HeapWord* const end_of_live = space->_end_of_live; // Established by "scan_and_forward".
HeapWord* const first_dead = space->_first_dead; // Established by "scan_and_forward".
assert(first_dead <= end_of_live, "Stands to reason, no?");
- if (cur_obj < end_of_live && first_dead > cur_obj && !oop(cur_obj)->is_gc_marked()) {
- // we have a chunk of the space which hasn't moved and we've
- // reinitialized the mark word during the previous pass, so we can't
- // use is_gc_marked for the traversal.
-
- while (cur_obj < first_dead) {
- // I originally tried to conjoin "block_start(cur_obj) == cur_obj" to the
- // assertion below, but that doesn't work, because you can't
- // accurately traverse previous objects to get to the current one
- // after their pointers have been
- // updated, until the actual compaction is done. dld, 4/00
- assert(space->block_is_obj(cur_obj), "should be at block boundaries, and should be looking at objs");
-
- // point all the oops to the new location
- size_t size = MarkSweep::adjust_pointers(oop(cur_obj));
- size = space->adjust_obj_size(size);
-
- cur_obj += size;
- }
-
- if (first_dead == end_of_live) {
- cur_obj = end_of_live;
- } else {
- // The first dead object is no longer an object. At that memory address,
- // there is a pointer to the first live object that the previous phase found.
- cur_obj = *(HeapWord**)first_dead;
- }
- }
-
const intx interval = PrefetchScanIntervalInBytes;
debug_only(HeapWord* prev_obj = NULL);
while (cur_obj < end_of_live) {
Prefetch::write(cur_obj, interval);
! if (oop(cur_obj)->is_gc_marked()) {
// cur_obj is alive
// point all the oops to the new location
size_t size = MarkSweep::adjust_pointers(oop(cur_obj));
size = space->adjust_obj_size(size);
debug_only(prev_obj = cur_obj);
--- 187,202 ----
HeapWord* const end_of_live = space->_end_of_live; // Established by "scan_and_forward".
HeapWord* const first_dead = space->_first_dead; // Established by "scan_and_forward".
assert(first_dead <= end_of_live, "Stands to reason, no?");
const intx interval = PrefetchScanIntervalInBytes;
debug_only(HeapWord* prev_obj = NULL);
while (cur_obj < end_of_live) {
Prefetch::write(cur_obj, interval);
! if (cur_obj < first_dead || oop(cur_obj)->is_gc_marked()) {
// cur_obj is alive
// point all the oops to the new location
size_t size = MarkSweep::adjust_pointers(oop(cur_obj));
size = space->adjust_obj_size(size);
debug_only(prev_obj = cur_obj);
< prev index next >