| Index: Source/platform/heap/Heap.cpp
|
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
|
| index ee78353fee1f2e20aa0e6d4c70db925e4b5823d1..c84ef8cdebfd8b36b41da8d7eefdcbb5da500b65 100644
|
| --- a/Source/platform/heap/Heap.cpp
|
| +++ b/Source/platform/heap/Heap.cpp
|
| @@ -2473,8 +2473,7 @@ void Heap::collectGarbage(ThreadState::StackState stackState, ThreadState::GCTyp
|
| s_markingVisitor->configureEagerTraceLimit();
|
| ASSERT(s_markingVisitor->canTraceEagerly());
|
|
|
| - Heap::resetMarkedObjectSize();
|
| - Heap::resetAllocatedObjectSize();
|
| + Heap::resetHeapCounters();
|
|
|
| // 1. Trace persistent roots.
|
| ThreadState::visitPersistentRoots(s_markingVisitor);
|
| @@ -2850,6 +2849,45 @@ void Heap::RegionTree::remove(PageMemoryRegion* region, RegionTree** context)
|
| delete current;
|
| }
|
|
|
| +void Heap::resetHeapCounters()
|
| +{
|
| + ASSERT(ThreadState::current()->isInGC());
|
| +
|
| + s_allocatedObjectSize = 0;
|
| + s_markedObjectSize = 0;
|
| +
|
| + // Similarly, reset the amount of externally allocated memory.
|
| + s_externallyAllocatedBytes = 0;
|
| + s_externallyAllocatedBytesAlive = 0;
|
| +
|
| + s_requestedUrgentGC = false;
|
| +}
|
| +
|
| +void Heap::increaseExternallyAllocatedBytes(size_t delta)
|
| +{
|
| + atomicAdd(&s_externallyAllocatedBytes, static_cast<long>(delta));
|
| +
|
| + if (isGCUrgentlyRequested())
|
| + return;
|
| +
|
| + // Flag GC urgency on a 50% increase in external allocation
|
| + // since the last GC, but not for less than 100M.
|
| + size_t externalBytesSinceGC = externallyAllocatedBytes();
|
| + if (externalBytesSinceGC < 10 * 1024 * 1024)
|
| + return;
|
| +
|
| + size_t externalBytesAlive = externallyAllocatedBytesAlive();
|
| +
|
| + // The urgent-gc flag will be considered the next time an out-of-line
|
| + // allocation is made. Bump allocations from the current block will
|
| + // go ahead until that block has been exhausted.
|
| + // FIXME: if that delays urgently needed GCs for too long, consider
|
| + // flushing out per-heap "allocation points" to trigger the GC
|
| + // right away.
|
| + if (externalBytesSinceGC > externalBytesAlive / 2)
|
| + Heap::requestUrgentGC();
|
| +}
|
| +
|
| Visitor* Heap::s_markingVisitor;
|
| CallbackStack* Heap::s_markingStack;
|
| CallbackStack* Heap::s_postMarkingCallbackStack;
|
| @@ -2865,4 +2903,8 @@ size_t Heap::s_allocatedObjectSize = 0;
|
| size_t Heap::s_allocatedSpace = 0;
|
| size_t Heap::s_markedObjectSize = 0;
|
|
|
| +size_t Heap::s_externallyAllocatedBytes = 0;
|
| +size_t Heap::s_externallyAllocatedBytesAlive = 0;
|
| +unsigned Heap::s_requestedUrgentGC = false;
|
| +
|
| } // namespace blink
|
|
|