mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-11 05:59:52 +00:00
8279856: Parallel: Use PreservedMarks to record promotion-failed objects
Reviewed-by: sjohanss, tschatzl
This commit is contained in:
parent
de3113b998
commit
16ec47d5e5
@ -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.");
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user