Commit 3d2b211a authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

[heap] Scavenger: Restructure main processing method

- Add scopes
- Rename scopes to fit hierarchy
- Scavenge weak collections before parallel phase
- Remove semi space phase which doesn't exist anymore

Bug: chromium:738865
Change-Id: Id3b72793e764f8d3597917e45185d08675b57f5d
Reviewed-on: https://chromium-review.googlesource.com/593611Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47002}
parent 68fb6215
...@@ -459,14 +459,15 @@ void GCTracer::PrintNVP() const { ...@@ -459,14 +459,15 @@ void GCTracer::PrintNVP() const {
"heap.external.prologue=%.2f " "heap.external.prologue=%.2f "
"heap.external.epilogue=%.2f " "heap.external.epilogue=%.2f "
"heap.external_weak_global_handles=%.2f " "heap.external_weak_global_handles=%.2f "
"fast_promote=%.2f "
"scavenge=%.2f " "scavenge=%.2f "
"evacuate=%.2f " "scavenge.roots=%.2f "
"old_new=%.2f " "scavenge.weak=%.2f "
"weak=%.2f " "scavenge.weak_global_handles.identify=%.2f"
"roots=%.2f " "scavenge.weak_global_handles.process=%.2f"
"semispace=%.2f " "scavenge.parallel=%.2f "
"steps_count=%d " "incremental.steps_count=%d "
"steps_took=%.1f " "incremental.steps_took=%.1f "
"scavenge_throughput=%.f " "scavenge_throughput=%.f "
"total_size_before=%" PRIuS "total_size_before=%" PRIuS
" " " "
...@@ -498,12 +499,15 @@ void GCTracer::PrintNVP() const { ...@@ -498,12 +499,15 @@ void GCTracer::PrintNVP() const {
current_.scopes[Scope::HEAP_EXTERNAL_PROLOGUE], current_.scopes[Scope::HEAP_EXTERNAL_PROLOGUE],
current_.scopes[Scope::HEAP_EXTERNAL_EPILOGUE], current_.scopes[Scope::HEAP_EXTERNAL_EPILOGUE],
current_.scopes[Scope::HEAP_EXTERNAL_WEAK_GLOBAL_HANDLES], current_.scopes[Scope::HEAP_EXTERNAL_WEAK_GLOBAL_HANDLES],
current_.scopes[Scope::SCAVENGER_FAST_PROMOTE],
current_.scopes[Scope::SCAVENGER_SCAVENGE], current_.scopes[Scope::SCAVENGER_SCAVENGE],
current_.scopes[Scope::SCAVENGER_EVACUATE], current_.scopes[Scope::SCAVENGER_SCAVENGE_ROOTS],
current_.scopes[Scope::SCAVENGER_OLD_TO_NEW_POINTERS], current_.scopes[Scope::SCAVENGER_SCAVENGE_WEAK],
current_.scopes[Scope::SCAVENGER_WEAK], current_
current_.scopes[Scope::SCAVENGER_ROOTS], .scopes[Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_IDENTIFY],
current_.scopes[Scope::SCAVENGER_SEMISPACE], current_
.scopes[Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS],
current_.scopes[Scope::SCAVENGER_SCAVENGE_PARALLEL],
current_.incremental_marking_scopes[GCTracer::Scope::MC_INCREMENTAL] current_.incremental_marking_scopes[GCTracer::Scope::MC_INCREMENTAL]
.steps, .steps,
current_.scopes[Scope::MC_INCREMENTAL], current_.scopes[Scope::MC_INCREMENTAL],
......
...@@ -35,80 +35,81 @@ enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects }; ...@@ -35,80 +35,81 @@ enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects };
F(MC_INCREMENTAL_EXTERNAL_EPILOGUE) \ F(MC_INCREMENTAL_EXTERNAL_EPILOGUE) \
F(MC_INCREMENTAL_EXTERNAL_PROLOGUE) F(MC_INCREMENTAL_EXTERNAL_PROLOGUE)
#define TRACER_SCOPES(F) \ #define TRACER_SCOPES(F) \
INCREMENTAL_SCOPES(F) \ INCREMENTAL_SCOPES(F) \
F(HEAP_EPILOGUE) \ F(HEAP_EPILOGUE) \
F(HEAP_EPILOGUE_REDUCE_NEW_SPACE) \ F(HEAP_EPILOGUE_REDUCE_NEW_SPACE) \
F(HEAP_EXTERNAL_EPILOGUE) \ F(HEAP_EXTERNAL_EPILOGUE) \
F(HEAP_EXTERNAL_PROLOGUE) \ F(HEAP_EXTERNAL_PROLOGUE) \
F(HEAP_EXTERNAL_WEAK_GLOBAL_HANDLES) \ F(HEAP_EXTERNAL_WEAK_GLOBAL_HANDLES) \
F(HEAP_PROLOGUE) \ F(HEAP_PROLOGUE) \
F(MC_CLEAR) \ F(MC_CLEAR) \
F(MC_CLEAR_DEPENDENT_CODE) \ F(MC_CLEAR_DEPENDENT_CODE) \
F(MC_CLEAR_MAPS) \ F(MC_CLEAR_MAPS) \
F(MC_CLEAR_SLOTS_BUFFER) \ F(MC_CLEAR_SLOTS_BUFFER) \
F(MC_CLEAR_STORE_BUFFER) \ F(MC_CLEAR_STORE_BUFFER) \
F(MC_CLEAR_STRING_TABLE) \ F(MC_CLEAR_STRING_TABLE) \
F(MC_CLEAR_WEAK_CELLS) \ F(MC_CLEAR_WEAK_CELLS) \
F(MC_CLEAR_WEAK_COLLECTIONS) \ F(MC_CLEAR_WEAK_COLLECTIONS) \
F(MC_CLEAR_WEAK_LISTS) \ F(MC_CLEAR_WEAK_LISTS) \
F(MC_EPILOGUE) \ F(MC_EPILOGUE) \
F(MC_EVACUATE) \ F(MC_EVACUATE) \
F(MC_EVACUATE_CANDIDATES) \ F(MC_EVACUATE_CANDIDATES) \
F(MC_EVACUATE_CLEAN_UP) \ F(MC_EVACUATE_CLEAN_UP) \
F(MC_EVACUATE_COPY) \ F(MC_EVACUATE_COPY) \
F(MC_EVACUATE_EPILOGUE) \ F(MC_EVACUATE_EPILOGUE) \
F(MC_EVACUATE_PROLOGUE) \ F(MC_EVACUATE_PROLOGUE) \
F(MC_EVACUATE_REBALANCE) \ F(MC_EVACUATE_REBALANCE) \
F(MC_EVACUATE_UPDATE_POINTERS) \ F(MC_EVACUATE_UPDATE_POINTERS) \
F(MC_EVACUATE_UPDATE_POINTERS_SLOTS) \ F(MC_EVACUATE_UPDATE_POINTERS_SLOTS) \
F(MC_EVACUATE_UPDATE_POINTERS_TO_NEW_ROOTS) \ F(MC_EVACUATE_UPDATE_POINTERS_TO_NEW_ROOTS) \
F(MC_EVACUATE_UPDATE_POINTERS_WEAK) \ F(MC_EVACUATE_UPDATE_POINTERS_WEAK) \
F(MC_FINISH) \ F(MC_FINISH) \
F(MC_MARK) \ F(MC_MARK) \
F(MC_MARK_FINISH_INCREMENTAL) \ F(MC_MARK_FINISH_INCREMENTAL) \
F(MC_MARK_ROOTS) \ F(MC_MARK_ROOTS) \
F(MC_MARK_WEAK_CLOSURE) \ F(MC_MARK_WEAK_CLOSURE) \
F(MC_MARK_WEAK_CLOSURE_EPHEMERAL) \ F(MC_MARK_WEAK_CLOSURE_EPHEMERAL) \
F(MC_MARK_WEAK_CLOSURE_WEAK_HANDLES) \ F(MC_MARK_WEAK_CLOSURE_WEAK_HANDLES) \
F(MC_MARK_WEAK_CLOSURE_WEAK_ROOTS) \ F(MC_MARK_WEAK_CLOSURE_WEAK_ROOTS) \
F(MC_MARK_WEAK_CLOSURE_HARMONY) \ F(MC_MARK_WEAK_CLOSURE_HARMONY) \
F(MC_MARK_WRAPPER_EPILOGUE) \ F(MC_MARK_WRAPPER_EPILOGUE) \
F(MC_MARK_WRAPPER_PROLOGUE) \ F(MC_MARK_WRAPPER_PROLOGUE) \
F(MC_MARK_WRAPPER_TRACING) \ F(MC_MARK_WRAPPER_TRACING) \
F(MC_PROLOGUE) \ F(MC_PROLOGUE) \
F(MC_SWEEP) \ F(MC_SWEEP) \
F(MC_SWEEP_CODE) \ F(MC_SWEEP_CODE) \
F(MC_SWEEP_MAP) \ F(MC_SWEEP_MAP) \
F(MC_SWEEP_OLD) \ F(MC_SWEEP_OLD) \
F(MINOR_MC) \ F(MINOR_MC) \
F(MINOR_MC_CLEAR) \ F(MINOR_MC_CLEAR) \
F(MINOR_MC_CLEAR_STRING_TABLE) \ F(MINOR_MC_CLEAR_STRING_TABLE) \
F(MINOR_MC_CLEAR_WEAK_LISTS) \ F(MINOR_MC_CLEAR_WEAK_LISTS) \
F(MINOR_MC_EVACUATE) \ F(MINOR_MC_EVACUATE) \
F(MINOR_MC_EVACUATE_CLEAN_UP) \ F(MINOR_MC_EVACUATE_CLEAN_UP) \
F(MINOR_MC_EVACUATE_COPY) \ F(MINOR_MC_EVACUATE_COPY) \
F(MINOR_MC_EVACUATE_EPILOGUE) \ F(MINOR_MC_EVACUATE_EPILOGUE) \
F(MINOR_MC_EVACUATE_PROLOGUE) \ F(MINOR_MC_EVACUATE_PROLOGUE) \
F(MINOR_MC_EVACUATE_REBALANCE) \ F(MINOR_MC_EVACUATE_REBALANCE) \
F(MINOR_MC_EVACUATE_UPDATE_POINTERS) \ F(MINOR_MC_EVACUATE_UPDATE_POINTERS) \
F(MINOR_MC_EVACUATE_UPDATE_POINTERS_SLOTS) \ F(MINOR_MC_EVACUATE_UPDATE_POINTERS_SLOTS) \
F(MINOR_MC_EVACUATE_UPDATE_POINTERS_TO_NEW_ROOTS) \ F(MINOR_MC_EVACUATE_UPDATE_POINTERS_TO_NEW_ROOTS) \
F(MINOR_MC_EVACUATE_UPDATE_POINTERS_WEAK) \ F(MINOR_MC_EVACUATE_UPDATE_POINTERS_WEAK) \
F(MINOR_MC_MARK) \ F(MINOR_MC_MARK) \
F(MINOR_MC_MARK_GLOBAL_HANDLES) \ F(MINOR_MC_MARK_GLOBAL_HANDLES) \
F(MINOR_MC_MARK_SEED) \ F(MINOR_MC_MARK_SEED) \
F(MINOR_MC_MARK_ROOTS) \ F(MINOR_MC_MARK_ROOTS) \
F(MINOR_MC_MARK_WEAK) \ F(MINOR_MC_MARK_WEAK) \
F(MINOR_MC_MARKING_DEQUE) \ F(MINOR_MC_MARKING_DEQUE) \
F(MINOR_MC_RESET_LIVENESS) \ F(MINOR_MC_RESET_LIVENESS) \
F(MINOR_MC_SWEEPING) \ F(MINOR_MC_SWEEPING) \
F(SCAVENGER_EVACUATE) \ F(SCAVENGER_FAST_PROMOTE) \
F(SCAVENGER_OLD_TO_NEW_POINTERS) \ F(SCAVENGER_SCAVENGE) \
F(SCAVENGER_ROOTS) \ F(SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_IDENTIFY) \
F(SCAVENGER_SCAVENGE) \ F(SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS) \
F(SCAVENGER_SEMISPACE) \ F(SCAVENGER_SCAVENGE_PARALLEL) \
F(SCAVENGER_WEAK) F(SCAVENGER_SCAVENGE_ROOTS) \
F(SCAVENGER_SCAVENGE_WEAK)
#define TRACE_GC(tracer, scope_id) \ #define TRACE_GC(tracer, scope_id) \
GCTracer::Scope::ScopeId gc_tracer_scope_id(scope_id); \ GCTracer::Scope::ScopeId gc_tracer_scope_id(scope_id); \
......
...@@ -1746,7 +1746,7 @@ class ScavengeWeakObjectRetainer : public WeakObjectRetainer { ...@@ -1746,7 +1746,7 @@ class ScavengeWeakObjectRetainer : public WeakObjectRetainer {
}; };
void Heap::EvacuateYoungGeneration() { void Heap::EvacuateYoungGeneration() {
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_EVACUATE); TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_FAST_PROMOTE);
base::LockGuard<base::Mutex> guard(relocation_mutex()); base::LockGuard<base::Mutex> guard(relocation_mutex());
ConcurrentMarking::PauseScope pause_scope(concurrent_marking()); ConcurrentMarking::PauseScope pause_scope(concurrent_marking());
if (!FLAG_concurrent_marking) { if (!FLAG_concurrent_marking) {
...@@ -1937,37 +1937,41 @@ void Heap::Scavenge() { ...@@ -1937,37 +1937,41 @@ void Heap::Scavenge() {
RootScavengeVisitor root_scavenge_visitor(this, scavengers[kMainThreadId]); RootScavengeVisitor root_scavenge_visitor(this, scavengers[kMainThreadId]);
isolate()->global_handles()->IdentifyWeakUnmodifiedObjects( {
&JSObject::IsUnmodifiedApiObject); // Identify weak unmodified handles. Requires an unmodified graph.
TRACE_GC(tracer(),
GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_IDENTIFY);
isolate()->global_handles()->IdentifyWeakUnmodifiedObjects(
&JSObject::IsUnmodifiedApiObject);
}
{ {
// Copy roots. // Copy roots.
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_ROOTS); TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE_ROOTS);
IterateRoots(&root_scavenge_visitor, VISIT_ALL_IN_SCAVENGE); IterateRoots(&root_scavenge_visitor, VISIT_ALL_IN_SCAVENGE);
} }
{ {
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_OLD_TO_NEW_POINTERS); // Weak collections are held strongly by the Scavenger.
job.Run(); TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK);
IterateEncounteredWeakCollections(&root_scavenge_visitor);
} }
{ {
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_WEAK); // Parallel phase scavenging all copied and promoted objects.
IterateEncounteredWeakCollections(&root_scavenge_visitor); TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE_PARALLEL);
job.Run();
DCHECK(copied_list.IsGlobalEmpty());
DCHECK(promotion_list.IsGlobalEmpty());
} }
{ {
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); // Scavenge weak global handles.
TRACE_GC(tracer(),
GCTracer::Scope::SCAVENGER_SCAVENGE_WEAK_GLOBAL_HANDLES_PROCESS);
isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending(
&IsUnscavengedHeapObject);
isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots(
&root_scavenge_visitor);
scavengers[kMainThreadId]->Process(); scavengers[kMainThreadId]->Process();
} }
isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending(
&IsUnscavengedHeapObject);
isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots(
&root_scavenge_visitor);
scavengers[kMainThreadId]->Process();
for (int i = 0; i < num_scavenge_tasks; i++) { for (int i = 0; i < num_scavenge_tasks; i++) {
scavengers[i]->Finalize(); scavengers[i]->Finalize();
delete scavengers[i]; delete scavengers[i];
......
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