| Index: Source/platform/heap/ThreadState.cpp
|
| diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp
|
| index dfc6c854356c3c4a2ef2bcfba48050fa6034a02f..62161b605deae77ead448c57a517e01937264210 100644
|
| --- a/Source/platform/heap/ThreadState.cpp
|
| +++ b/Source/platform/heap/ThreadState.cpp
|
| @@ -633,6 +633,23 @@ bool ThreadState::shouldSchedulePreciseGC()
|
| #endif
|
| }
|
|
|
| +bool ThreadState::shouldSchedulePreciseGCOnNavigation(float estimatedRemovalRatio)
|
| +{
|
| + // Avoid potential overflow by truncating to Kb.
|
| + size_t allocatedObjectSizeKb = Heap::allocatedObjectSize() >> 10;
|
| + // The estimated size is updated when the main thread finishes lazy
|
| + // sweeping. If this thread reaches here before the main thread finishes
|
| + // lazy sweeping, the thread will use the estimated size of the last GC.
|
| + size_t estimatedLiveObjectSizeKb = (estimatedLiveObjectSize() >> 10) * (1 - estimatedRemovalRatio);
|
| + // Heap::markedObjectSize() may be underestimated if any thread has not
|
| + // finished completeSweep().
|
| + size_t currentObjectSizeKb = currentObjectSize() >> 10;
|
| + // Schedule a precise GC if Oilpan has allocated more than 1 MB since
|
| + // the last GC and the current memory usage is >50% larger than
|
| + // the estimated live memory usage.
|
| + return allocatedObjectSizeKb >= 1024 && currentObjectSizeKb > (estimatedLiveObjectSizeKb * 3) / 2;
|
| +}
|
| +
|
| // TODO(haraken): We should improve the GC heuristics.
|
| // These heuristics affect performance significantly.
|
| bool ThreadState::shouldForceConservativeGC()
|
| @@ -891,7 +908,7 @@ void ThreadState::runScheduledGC(StackState stackState)
|
| Heap::collectAllGarbage();
|
| break;
|
| case PreciseGCScheduled:
|
| - Heap::collectGarbage(NoHeapPointersOnStack, GCWithoutSweep, Heap::PreciseGC);
|
| + Heap::collectGarbage(NoHeapPointersOnStack, GCWithSweep, Heap::PreciseGC);
|
| break;
|
| case IdleGCScheduled:
|
| // Idle time GC will be scheduled by Blink Scheduler.
|
|
|