Commit 18ced8a5 authored by Omer Katz's avatar Omer Katz Committed by V8 LUCI CQ

heap: Young gen cleanups

Various cleanups around young generation GCs.

These include:
(*) Repalce minor_mark_compact_collector_ with a unique_ptr and merge
    initialization with the mark_compact_collector_ and
    scavenger_collector_.
(*) Rename IncrementalMarking::UpdateMarkingWorklistAfterScavenge to
    IncrementalMarking::UpdateMarkingWorklistAfterYoungGenGC.
(*) Remove redundant MarkingTreatmentMode parameter from
    MakeIterable.

Bug: v8:12612
Change-Id: Ifac7006d3425808a4b9e4c8e1af054a60c073180
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3448380Reviewed-by: 's avatarMichael Lippautz <mlippautz@chromium.org>
Commit-Queue: Omer Katz <omerkatz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#79077}
parent 284aa5e3
...@@ -2626,7 +2626,7 @@ void Heap::MinorMarkCompact() { ...@@ -2626,7 +2626,7 @@ void Heap::MinorMarkCompact() {
incremental_marking()); incremental_marking());
ConcurrentMarking::PauseScope pause_scope(concurrent_marking()); ConcurrentMarking::PauseScope pause_scope(concurrent_marking());
minor_mark_compact_collector()->CollectGarbage(); minor_mark_compact_collector_->CollectGarbage();
SetGCState(NOT_IN_GC); SetGCState(NOT_IN_GC);
} }
...@@ -4693,7 +4693,7 @@ class OldToNewSlotVerifyingVisitor : public SlotVerifyingVisitor { ...@@ -4693,7 +4693,7 @@ class OldToNewSlotVerifyingVisitor : public SlotVerifyingVisitor {
void VisitEphemeron(HeapObject host, int index, ObjectSlot key, void VisitEphemeron(HeapObject host, int index, ObjectSlot key,
ObjectSlot target) override { ObjectSlot target) override {
VisitPointer(host, target); VisitPointer(host, target);
if (FLAG_minor_mc) return VisitPointer(host, target); if (FLAG_minor_mc) return;
// Keys are handled separately and should never appear in this set. // Keys are handled separately and should never appear in this set.
CHECK(!InUntypedSet(key)); CHECK(!InUntypedSet(key));
Object k = *key; Object k = *key;
...@@ -5775,6 +5775,7 @@ void Heap::SetUp(LocalHeap* main_thread_local_heap) { ...@@ -5775,6 +5775,7 @@ void Heap::SetUp(LocalHeap* main_thread_local_heap) {
mark_compact_collector_.reset(new MarkCompactCollector(this)); mark_compact_collector_.reset(new MarkCompactCollector(this));
scavenger_collector_.reset(new ScavengerCollector(this)); scavenger_collector_.reset(new ScavengerCollector(this));
minor_mark_compact_collector_.reset(new MinorMarkCompactCollector(this));
incremental_marking_.reset( incremental_marking_.reset(
new IncrementalMarking(this, mark_compact_collector_->weak_objects())); new IncrementalMarking(this, mark_compact_collector_->weak_objects()));
...@@ -5869,7 +5870,6 @@ void Heap::SetUpSpaces(LinearAllocationArea* new_allocation_info, ...@@ -5869,7 +5870,6 @@ void Heap::SetUpSpaces(LinearAllocationArea* new_allocation_info,
} }
tracer_.reset(new GCTracer(this)); tracer_.reset(new GCTracer(this));
minor_mark_compact_collector_ = new MinorMarkCompactCollector(this);
array_buffer_sweeper_.reset(new ArrayBufferSweeper(this)); array_buffer_sweeper_.reset(new ArrayBufferSweeper(this));
gc_idle_time_handler_.reset(new GCIdleTimeHandler()); gc_idle_time_handler_.reset(new GCIdleTimeHandler());
memory_measurement_.reset(new MemoryMeasurement(isolate())); memory_measurement_.reset(new MemoryMeasurement(isolate()));
...@@ -5890,8 +5890,8 @@ void Heap::SetUpSpaces(LinearAllocationArea* new_allocation_info, ...@@ -5890,8 +5890,8 @@ void Heap::SetUpSpaces(LinearAllocationArea* new_allocation_info,
LOG(isolate_, IntPtrTEvent("heap-available", Available())); LOG(isolate_, IntPtrTEvent("heap-available", Available()));
mark_compact_collector()->SetUp(); mark_compact_collector()->SetUp();
if (minor_mark_compact_collector() != nullptr) { if (minor_mark_compact_collector_) {
minor_mark_compact_collector()->SetUp(); minor_mark_compact_collector_->SetUp();
} }
if (new_space()) { if (new_space()) {
...@@ -6171,10 +6171,9 @@ void Heap::TearDown() { ...@@ -6171,10 +6171,9 @@ void Heap::TearDown() {
mark_compact_collector_.reset(); mark_compact_collector_.reset();
} }
if (minor_mark_compact_collector_ != nullptr) { if (minor_mark_compact_collector_) {
minor_mark_compact_collector_->TearDown(); minor_mark_compact_collector_->TearDown();
delete minor_mark_compact_collector_; minor_mark_compact_collector_.reset();
minor_mark_compact_collector_ = nullptr;
} }
scavenger_collector_.reset(); scavenger_collector_.reset();
......
...@@ -870,7 +870,7 @@ class Heap { ...@@ -870,7 +870,7 @@ class Heap {
} }
MinorMarkCompactCollector* minor_mark_compact_collector() { MinorMarkCompactCollector* minor_mark_compact_collector() {
return minor_mark_compact_collector_; return minor_mark_compact_collector_.get();
} }
ArrayBufferSweeper* array_buffer_sweeper() { ArrayBufferSweeper* array_buffer_sweeper() {
...@@ -2327,7 +2327,7 @@ class Heap { ...@@ -2327,7 +2327,7 @@ class Heap {
std::unique_ptr<GCTracer> tracer_; std::unique_ptr<GCTracer> tracer_;
std::unique_ptr<MarkCompactCollector> mark_compact_collector_; std::unique_ptr<MarkCompactCollector> mark_compact_collector_;
MinorMarkCompactCollector* minor_mark_compact_collector_ = nullptr; std::unique_ptr<MinorMarkCompactCollector> minor_mark_compact_collector_;
std::unique_ptr<ScavengerCollector> scavenger_collector_; std::unique_ptr<ScavengerCollector> scavenger_collector_;
std::unique_ptr<ArrayBufferSweeper> array_buffer_sweeper_; std::unique_ptr<ArrayBufferSweeper> array_buffer_sweeper_;
......
...@@ -436,7 +436,7 @@ void IncrementalMarking::FinalizeIncrementally() { ...@@ -436,7 +436,7 @@ void IncrementalMarking::FinalizeIncrementally() {
} }
} }
void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() { void IncrementalMarking::UpdateMarkingWorklistAfterYoungGenGC() {
if (!IsMarking()) return; if (!IsMarking()) return;
Map filler_map = ReadOnlyRoots(heap_).one_pointer_filler_map(); Map filler_map = ReadOnlyRoots(heap_).one_pointer_filler_map();
......
...@@ -138,7 +138,7 @@ class V8_EXPORT_PRIVATE IncrementalMarking final { ...@@ -138,7 +138,7 @@ class V8_EXPORT_PRIVATE IncrementalMarking final {
void FinalizeIncrementally(); void FinalizeIncrementally();
void UpdateMarkingWorklistAfterScavenge(); void UpdateMarkingWorklistAfterYoungGenGC();
void UpdateMarkedBytesAfterScavenge(size_t dead_bytes_in_new_space); void UpdateMarkedBytesAfterScavenge(size_t dead_bytes_in_new_space);
void Hurry(); void Hurry();
......
...@@ -5288,7 +5288,7 @@ void MinorMarkCompactCollector::CollectGarbage() { ...@@ -5288,7 +5288,7 @@ void MinorMarkCompactCollector::CollectGarbage() {
{ {
TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARKING_DEQUE); TRACE_GC(heap()->tracer(), GCTracer::Scope::MINOR_MC_MARKING_DEQUE);
heap()->incremental_marking()->UpdateMarkingWorklistAfterScavenge(); heap()->incremental_marking()->UpdateMarkingWorklistAfterYoungGenGC();
} }
{ {
...@@ -5314,8 +5314,7 @@ void MinorMarkCompactCollector::CollectGarbage() { ...@@ -5314,8 +5314,7 @@ void MinorMarkCompactCollector::CollectGarbage() {
} }
void MinorMarkCompactCollector::MakeIterable( void MinorMarkCompactCollector::MakeIterable(
Page* p, MarkingTreatmentMode marking_mode, Page* p, FreeSpaceTreatmentMode free_space_mode) {
FreeSpaceTreatmentMode free_space_mode) {
CHECK(!p->IsLargePage()); CHECK(!p->IsLargePage());
// We have to clear the full collectors markbits for the areas that we // We have to clear the full collectors markbits for the areas that we
// remove here. // remove here.
...@@ -5357,11 +5356,6 @@ void MinorMarkCompactCollector::MakeIterable( ...@@ -5357,11 +5356,6 @@ void MinorMarkCompactCollector::MakeIterable(
p->heap()->CreateFillerObjectAt(free_start, static_cast<int>(size), p->heap()->CreateFillerObjectAt(free_start, static_cast<int>(size),
ClearRecordedSlots::kNo); ClearRecordedSlots::kNo);
} }
if (marking_mode == MarkingTreatmentMode::CLEAR) {
non_atomic_marking_state()->ClearLiveness(p);
p->ClearFlag(Page::SWEEP_TO_ITERATE);
}
} }
namespace { namespace {
...@@ -5935,14 +5929,12 @@ void YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk, ...@@ -5935,14 +5929,12 @@ void YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk,
marking_state->live_bytes(chunk)); marking_state->live_bytes(chunk));
if (!chunk->IsLargePage()) { if (!chunk->IsLargePage()) {
if (heap()->ShouldZapGarbage()) { if (heap()->ShouldZapGarbage()) {
collector_->MakeIterable(static_cast<Page*>(chunk), collector_->MakeIterable(static_cast<Page*>(chunk), ZAP_FREE_SPACE);
MarkingTreatmentMode::KEEP, ZAP_FREE_SPACE);
} else if (heap()->incremental_marking()->IsMarking()) { } else if (heap()->incremental_marking()->IsMarking()) {
// When incremental marking is on, we need to clear the mark bits of // When incremental marking is on, we need to clear the mark bits of
// the full collector. We cannot yet discard the young generation mark // the full collector. We cannot yet discard the young generation mark
// bits as they are still relevant for pointers updating. // bits as they are still relevant for pointers updating.
collector_->MakeIterable(static_cast<Page*>(chunk), collector_->MakeIterable(static_cast<Page*>(chunk),
MarkingTreatmentMode::KEEP,
IGNORE_FREE_SPACE); IGNORE_FREE_SPACE);
} }
} }
...@@ -5955,14 +5947,12 @@ void YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk, ...@@ -5955,14 +5947,12 @@ void YoungGenerationEvacuator::RawEvacuatePage(MemoryChunk* chunk,
marking_state->live_bytes(chunk)); marking_state->live_bytes(chunk));
DCHECK(!chunk->IsLargePage()); DCHECK(!chunk->IsLargePage());
if (heap()->ShouldZapGarbage()) { if (heap()->ShouldZapGarbage()) {
collector_->MakeIterable(static_cast<Page*>(chunk), collector_->MakeIterable(static_cast<Page*>(chunk), ZAP_FREE_SPACE);
MarkingTreatmentMode::KEEP, ZAP_FREE_SPACE);
} else if (heap()->incremental_marking()->IsMarking()) { } else if (heap()->incremental_marking()->IsMarking()) {
// When incremental marking is on, we need to clear the mark bits of // When incremental marking is on, we need to clear the mark bits of
// the full collector. We cannot yet discard the young generation mark // the full collector. We cannot yet discard the young generation mark
// bits as they are still relevant for pointers updating. // bits as they are still relevant for pointers updating.
collector_->MakeIterable(static_cast<Page*>(chunk), collector_->MakeIterable(static_cast<Page*>(chunk), IGNORE_FREE_SPACE);
MarkingTreatmentMode::KEEP, IGNORE_FREE_SPACE);
} }
break; break;
case kObjectsOldToOld: case kObjectsOldToOld:
......
...@@ -187,7 +187,6 @@ class LiveObjectVisitor : AllStatic { ...@@ -187,7 +187,6 @@ class LiveObjectVisitor : AllStatic {
enum class AlwaysPromoteYoung { kYes, kNo }; enum class AlwaysPromoteYoung { kYes, kNo };
enum PageEvacuationMode { NEW_TO_NEW, NEW_TO_OLD }; enum PageEvacuationMode { NEW_TO_NEW, NEW_TO_OLD };
enum class MarkingTreatmentMode { KEEP, CLEAR };
enum class RememberedSetUpdatingMode { ALL, OLD_TO_NEW_ONLY }; enum class RememberedSetUpdatingMode { ALL, OLD_TO_NEW_ONLY };
// Base class for minor and full MC collectors. // Base class for minor and full MC collectors.
...@@ -865,8 +864,7 @@ class MinorMarkCompactCollector final : public MarkCompactCollectorBase { ...@@ -865,8 +864,7 @@ class MinorMarkCompactCollector final : public MarkCompactCollectorBase {
void TearDown() override; void TearDown() override;
void CollectGarbage() override; void CollectGarbage() override;
void MakeIterable(Page* page, MarkingTreatmentMode marking_mode, void MakeIterable(Page* page, FreeSpaceTreatmentMode free_space_mode);
FreeSpaceTreatmentMode free_space_mode);
void CleanupSweepToIteratePages(); void CleanupSweepToIteratePages();
private: private:
......
...@@ -414,7 +414,7 @@ void ScavengerCollector::CollectGarbage() { ...@@ -414,7 +414,7 @@ void ScavengerCollector::CollectGarbage() {
heap_->UpdateYoungReferencesInExternalStringTable( heap_->UpdateYoungReferencesInExternalStringTable(
&Heap::UpdateYoungReferenceInExternalStringTableEntry); &Heap::UpdateYoungReferenceInExternalStringTableEntry);
heap_->incremental_marking()->UpdateMarkingWorklistAfterScavenge(); heap_->incremental_marking()->UpdateMarkingWorklistAfterYoungGenGC();
if (V8_UNLIKELY(FLAG_track_retaining_path)) { if (V8_UNLIKELY(FLAG_track_retaining_path)) {
heap_->UpdateRetainersAfterScavenge(); heap_->UpdateRetainersAfterScavenge();
......
...@@ -1368,9 +1368,6 @@ class OneByteVectorResource : public v8::String::ExternalOneByteStringResource { ...@@ -1368,9 +1368,6 @@ class OneByteVectorResource : public v8::String::ExternalOneByteStringResource {
}; };
TEST(InternalizeExternal) { TEST(InternalizeExternal) {
// TODO(mlippautz): Remove once we add support for forwarding ThinStrings in
// minor MC
if (FLAG_minor_mc) return;
FLAG_stress_incremental_marking = false; FLAG_stress_incremental_marking = false;
CcTest::InitializeVM(); CcTest::InitializeVM();
i::Isolate* isolate = CcTest::i_isolate(); i::Isolate* isolate = CcTest::i_isolate();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment