예제 #1
0
void G1PrepareCompactClosure::free_humongous_region(HeapRegion* hr) {
  HeapWord* end = hr->end();
  FreeRegionList dummy_free_list("Dummy Free List for G1MarkSweep");

  hr->set_containing_set(NULL);
  _humongous_regions_removed++;

  _g1h->free_humongous_region(hr, &dummy_free_list, false /* skip_remset */);
  prepare_for_compaction(hr, end);
  dummy_free_list.remove_all();
}
예제 #2
0
bool G1PrepareCompactClosure::doHeapRegion(HeapRegion* hr) {
  if (hr->is_humongous()) {
    oop obj = oop(hr->humongous_start_region()->bottom());
    if (hr->is_starts_humongous() && obj->is_gc_marked()) {
      obj->forward_to(obj);
    }
    if (!obj->is_gc_marked()) {
      free_humongous_region(hr);
    }
  } else if (!hr->is_pinned()) {
    prepare_for_compaction(hr, hr->end());
  }
  return false;
}
예제 #3
0
void G1PrepareCompactClosure::free_humongous_region(HeapRegion* hr) {
  HeapWord* end = hr->end();
  FreeRegionList dummy_free_list("Dummy Free List for G1MarkSweep");

  assert(hr->is_starts_humongous(),
         "Only the start of a humongous region should be freed.");

  hr->set_containing_set(NULL);
  _humongous_regions_removed.increment(1u, hr->capacity());

  _g1h->free_humongous_region(hr, &dummy_free_list, false /* par */);
  prepare_for_compaction(hr, end);
  dummy_free_list.remove_all();
}
예제 #4
0
bool G1PrepareCompactClosure::doHeapRegion(HeapRegion* hr) {
  if (hr->is_humongous()) {
    if (hr->is_starts_humongous()) {
      oop obj = oop(hr->bottom());
      if (obj->is_gc_marked()) {
        obj->forward_to(obj);
      } else  {
        free_humongous_region(hr);
      }
    } else {
      assert(hr->is_continues_humongous(), "Invalid humongous.");
    }
  } else if (!hr->is_pinned()) {
    prepare_for_compaction(hr, hr->end());
  }
  return false;
}