Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1039,26 +1039,23 @@ void ShenandoahHeap::print_heap_regions_on(outputStream* st) const {
}
}

void ShenandoahHeap::trash_humongous_region_at(ShenandoahHeapRegion* start) {
size_t ShenandoahHeap::trash_humongous_region_at(ShenandoahHeapRegion* start) const {
assert(start->is_humongous_start(), "reclaim regions starting with the first one");

oop humongous_obj = cast_to_oop(start->bottom());
size_t size = humongous_obj->size();
size_t required_regions = ShenandoahHeapRegion::required_regions(size * HeapWordSize);
size_t index = start->index() + required_regions - 1;

assert(!start->has_live(), "liveness must be zero");

for(size_t i = 0; i < required_regions; i++) {
// Reclaim from tail. Otherwise, assertion fails when printing region to trace log,
// as it expects that every region belongs to a humongous region starting with a humongous start region.
ShenandoahHeapRegion* region = get_region(index --);

assert(region->is_humongous(), "expect correct humongous start or continuation");
// Do not try to get the size of this humongous object. STW collections will
// have already unloaded classes, so an unmarked object may have a bad klass pointer.
ShenandoahHeapRegion* region = start;
size_t index = region->index();
do {
assert(region->is_humongous(), "Expect correct humongous start or continuation");
assert(!region->is_cset(), "Humongous region should not be in collection set");

region->make_trash_immediate();
}
region = get_region(++index);
} while (region != nullptr && region->is_humongous_continuation());

// Return number of regions trashed
return index - start->index();
}

class ShenandoahCheckCleanGCLABClosure : public ThreadClosure {
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,7 @@ class ShenandoahHeap : public CollectedHeap {
static inline void atomic_clear_oop(narrowOop* addr, oop compare);
static inline void atomic_clear_oop(narrowOop* addr, narrowOop compare);

void trash_humongous_region_at(ShenandoahHeapRegion *r);
size_t trash_humongous_region_at(ShenandoahHeapRegion *r) const;

private:
void trash_cset_regions();
Expand Down