< prev index next >

src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp

Print this page
@@ -29,10 +29,11 @@
  #include "gc/g1/g1FullCollector.inline.hpp"
  #include "gc/g1/g1FullGCCompactionPoint.hpp"
  #include "gc/g1/g1FullGCCompactTask.hpp"
  #include "gc/g1/heapRegion.inline.hpp"
  #include "gc/shared/gcTraceTime.inline.hpp"
+ #include "gc/shared/slidingForwarding.inline.hpp"
  #include "logging/log.hpp"
  #include "oops/oop.inline.hpp"
  #include "utilities/ticks.hpp"
  
  // Do work for all skip-compacting regions.

@@ -56,18 +57,20 @@
      r->reset_skip_compacting_after_full_gc();
      return false;
    }
  };
  
- size_t G1FullGCCompactTask::G1CompactRegionClosure::apply(oop obj) {
+ template <bool ALT_FWD>
+ size_t G1FullGCCompactTask::G1CompactRegionClosure<ALT_FWD>::apply(oop obj) {
    size_t size = obj->size();
-   HeapWord* destination = cast_from_oop<HeapWord*>(obj->forwardee());
-   if (destination == NULL) {
+   if (!SlidingForwarding::is_forwarded(obj)) {
      // Object not moving
      return size;
    }
  
+   HeapWord* destination = cast_from_oop<HeapWord*>(SlidingForwarding::forwardee<ALT_FWD>(obj));
+ 
    // copy object and reinit its mark
    HeapWord* obj_addr = cast_from_oop<HeapWord*>(obj);
    assert(obj_addr != destination, "everything in this pass should be moving");
    Copy::aligned_conjoint_words(obj_addr, destination, size);
    cast_to_oop(destination)->init_mark();

@@ -77,12 +80,17 @@
  }
  
  void G1FullGCCompactTask::compact_region(HeapRegion* hr) {
    assert(!hr->is_pinned(), "Should be no pinned region in compaction queue");
    assert(!hr->is_humongous(), "Should be no humongous regions in compaction queue");
-   G1CompactRegionClosure compact(collector()->mark_bitmap());
-   hr->apply_to_marked_objects(collector()->mark_bitmap(), &compact);
+   if (UseAltGCForwarding) {
+     G1CompactRegionClosure<true> compact(collector()->mark_bitmap());
+     hr->apply_to_marked_objects(collector()->mark_bitmap(), &compact);
+   } else {
+     G1CompactRegionClosure<false> compact(collector()->mark_bitmap());
+     hr->apply_to_marked_objects(collector()->mark_bitmap(), &compact);
+   }
    // Clear the liveness information for this region if necessary i.e. if we actually look at it
    // for bitmap verification. Otherwise it is sufficient that we move the TAMS to bottom().
    if (G1VerifyBitmaps) {
      collector()->mark_bitmap()->clear_region(hr);
    }
< prev index next >