< prev index next >

src/share/vm/gc/parallel/psMarkSweepDecorator.cpp

Print this page

        

*** 27,37 **** #include "gc/parallel/objectStartArray.hpp" #include "gc/parallel/parallelScavengeHeap.hpp" #include "gc/parallel/psMarkSweep.hpp" #include "gc/parallel/psMarkSweepDecorator.hpp" #include "gc/serial/markSweep.inline.hpp" - #include "gc/shared/liveRange.hpp" #include "gc/shared/spaceDecorator.hpp" #include "oops/oop.inline.hpp" #include "runtime/prefetch.inline.hpp" PSMarkSweepDecorator* PSMarkSweepDecorator::_destination_decorator = NULL; --- 27,36 ----
*** 105,117 **** HeapWord* t = space()->top(); HeapWord* end_of_live= q; /* One byte beyond the last byte of the last live object. */ HeapWord* first_dead = space()->end(); /* The first dead object. */ - LiveRange* liveRange = NULL; /* The current live range, recorded in the - first header of preceding free area. */ - _first_dead = first_dead; const intx interval = PrefetchScanIntervalInBytes; while (q < t) { assert(oop(q)->mark()->is_marked() || oop(q)->mark()->is_unlocked() || --- 104,113 ----
*** 229,249 **** end_of_live = end; continue; } } ! /* for the previous LiveRange, record the end of the live objects. */ ! if (liveRange) { ! liveRange->set_end(q); ! } ! ! /* record the current LiveRange object. ! * liveRange->start() is overlaid on the mark word. ! */ ! liveRange = (LiveRange*)q; ! liveRange->set_start(end); ! liveRange->set_end(end); /* see if this is the first dead region. */ if (q < first_dead) { first_dead = q; } --- 225,236 ---- end_of_live = end; continue; } } ! // q is a pointer to a dead object. Use this dead memory to store a pointer to the next live object. ! (*(HeapWord**)q) = end; /* see if this is the first dead region. */ if (q < first_dead) { first_dead = q; }
*** 252,264 **** q = end; } } assert(q == t, "just checking"); - if (liveRange != NULL) { - liveRange->set_end(q); - } _end_of_live = end_of_live; if (end_of_live < first_dead) { first_dead = end_of_live; } _first_dead = first_dead; --- 239,248 ----
*** 305,317 **** } if (_first_dead == t) { q = t; } else { ! // $$$ This is funky. Using this to read the previously written ! // LiveRange. See also use below. ! q = (HeapWord*)oop(_first_dead)->mark()->decode_pointer(); } } const intx interval = PrefetchScanIntervalInBytes; debug_only(HeapWord* prev_q = NULL); --- 289,300 ---- } if (_first_dead == t) { q = t; } else { ! // The first dead object should contain a pointer to the first live object ! q = *(HeapWord**)_first_dead; } } const intx interval = PrefetchScanIntervalInBytes; debug_only(HeapWord* prev_q = NULL);
*** 323,337 **** // point all the oops to the new location size_t size = MarkSweep::adjust_pointers(oop(q)); debug_only(prev_q = q); q += size; } else { - // q is not a live object, so its mark should point at the next - // live object debug_only(prev_q = q); ! q = (HeapWord*) oop(q)->mark()->decode_pointer(); ! assert(q > prev_q, "we should be moving forward through memory"); } } assert(q == t, "just checking"); } --- 306,319 ---- // point all the oops to the new location size_t size = MarkSweep::adjust_pointers(oop(q)); debug_only(prev_q = q); q += size; } else { debug_only(prev_q = q); ! // q is not a live object, instead it points at the next live object ! q = *(HeapWord**)q; ! assert(q > prev_q, "we should be moving forward through memory, q: " PTR_FORMAT ", prev_q: " PTR_FORMAT, p2i(q), p2i(prev_q)); } } assert(q == t, "just checking"); }
< prev index next >