8279856: Parallel: Use PreservedMarks to record promotion-failed objects

Reviewed-by: sjohanss, tschatzl
This commit is contained in:
Albert Mingkun Yang 2022-02-01 08:47:10 +00:00
parent de3113b998
commit 16ec47d5e5
5 changed files with 16 additions and 12 deletions

View File

@ -339,7 +339,10 @@ oop PSPromotionManager::oop_promotion_failed(oop obj, markWord obj_mark) {
push_contents(obj);
_preserved_marks->push_if_necessary(obj, obj_mark);
// Save the markWord of promotion-failed objs in _preserved_marks for later
// restoration. This way we don't have to walk the young-gen to locate
// these promotion-failed objs.
_preserved_marks->push_always(obj, obj_mark);
} else {
// We lost, someone else "owns" this object
guarantee(obj->is_forwarded(), "Object must be forwarded if the cas failed.");

View File

@ -670,19 +670,11 @@ bool PSScavenge::invoke_no_policy() {
return !promotion_failure_occurred;
}
// This method iterates over all objects in the young generation,
// removing all forwarding references. It then restores any preserved marks.
void PSScavenge::clean_up_failed_promotion() {
ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
PSYoungGen* young_gen = heap->young_gen();
RemoveForwardedPointerClosure remove_fwd_ptr_closure;
young_gen->object_iterate(&remove_fwd_ptr_closure);
PSPromotionManager::restore_preserved_marks();
// Reset the PromotionFailureALot counters.
NOT_PRODUCT(heap->reset_promotion_should_fail();)
NOT_PRODUCT(ParallelScavengeHeap::heap()->reset_promotion_should_fail();)
}
bool PSScavenge::should_attempt_scavenge() {

View File

@ -125,8 +125,10 @@ public:
~RestorePreservedMarksTask() {
assert(_total_size == _total_size_before, "total_size = %zu before = %zu", _total_size, _total_size_before);
log_trace(gc)("Restored %zu marks", _total_size);
size_t mem_size = _total_size * (sizeof(oop) + sizeof(markWord));
log_trace(gc)("Restored %zu marks, occupying %zu %s", _total_size,
byte_size_in_proper_unit(mem_size),
proper_unit_for_byte_size(mem_size));
}
};

View File

@ -57,6 +57,7 @@ private:
public:
size_t size() const { return _stack.size(); }
inline void push_if_necessary(oop obj, markWord m);
inline void push_always(oop obj, markWord m);
// Iterate over the stack, restore all preserved marks, and
// reclaim the memory taken up by the stack segments.
void restore();

View File

@ -42,6 +42,12 @@ inline void PreservedMarks::push_if_necessary(oop obj, markWord m) {
}
}
inline void PreservedMarks::push_always(oop obj, markWord m) {
assert(!m.is_marked(), "precondition");
OopAndMarkWord elem(obj, m);
_stack.push(elem);
}
inline void PreservedMarks::init_forwarded_mark(oop obj) {
obj->init_mark();
}