| Index: third_party/WebKit/Source/platform/heap/Heap.cpp
|
| diff --git a/third_party/WebKit/Source/platform/heap/Heap.cpp b/third_party/WebKit/Source/platform/heap/Heap.cpp
|
| index 2caa5131e65772fe009a04e9c2696f25c6723282..bd3819fcb15931f2ec700d1170fef52f838932fb 100644
|
| --- a/third_party/WebKit/Source/platform/heap/Heap.cpp
|
| +++ b/third_party/WebKit/Source/platform/heap/Heap.cpp
|
| @@ -469,162 +469,6 @@ void ThreadHeap::postGC(BlinkGC::GCType gcType)
|
| state->postGC(gcType);
|
| }
|
|
|
| -const char* ThreadHeap::gcReasonString(BlinkGC::GCReason reason)
|
| -{
|
| - switch (reason) {
|
| - case BlinkGC::IdleGC:
|
| - return "IdleGC";
|
| - case BlinkGC::PreciseGC:
|
| - return "PreciseGC";
|
| - case BlinkGC::ConservativeGC:
|
| - return "ConservativeGC";
|
| - case BlinkGC::ForcedGC:
|
| - return "ForcedGC";
|
| - case BlinkGC::MemoryPressureGC:
|
| - return "MemoryPressureGC";
|
| - case BlinkGC::PageNavigationGC:
|
| - return "PageNavigationGC";
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| - return "<Unknown>";
|
| -}
|
| -
|
| -void ThreadHeap::collectGarbage(BlinkGC::StackState stackState, BlinkGC::GCType gcType, BlinkGC::GCReason reason)
|
| -{
|
| - ASSERT(gcType != BlinkGC::ThreadTerminationGC);
|
| -
|
| - ThreadState* state = ThreadState::current();
|
| - // Nested collectGarbage() invocations aren't supported.
|
| - RELEASE_ASSERT(!state->isGCForbidden());
|
| - state->completeSweep();
|
| -
|
| - std::unique_ptr<Visitor> visitor = Visitor::create(state, gcType);
|
| -
|
| - SafePointScope safePointScope(stackState, state);
|
| -
|
| - // Resume all parked threads upon leaving this scope.
|
| - ParkThreadsScope parkThreadsScope(state);
|
| -
|
| - // Try to park the other threads. If we're unable to, bail out of the GC.
|
| - if (!parkThreadsScope.parkThreads())
|
| - return;
|
| -
|
| - ScriptForbiddenIfMainThreadScope scriptForbidden;
|
| -
|
| - TRACE_EVENT2("blink_gc,devtools.timeline", "BlinkGCMarking",
|
| - "lazySweeping", gcType == BlinkGC::GCWithoutSweep,
|
| - "gcReason", gcReasonString(reason));
|
| - TRACE_EVENT_SCOPED_SAMPLING_STATE("blink_gc", "BlinkGC");
|
| - double startTime = WTF::currentTimeMS();
|
| -
|
| - if (gcType == BlinkGC::TakeSnapshot)
|
| - BlinkGCMemoryDumpProvider::instance()->clearProcessDumpForCurrentGC();
|
| -
|
| - // Disallow allocation during garbage collection (but not during the
|
| - // finalization that happens when the visitorScope is torn down).
|
| - ThreadState::NoAllocationScope noAllocationScope(state);
|
| -
|
| - state->heap().commitCallbackStacks();
|
| - state->heap().preGC();
|
| -
|
| - StackFrameDepthScope stackDepthScope(&state->heap().stackFrameDepth());
|
| -
|
| - size_t totalObjectSize = state->heap().heapStats().allocatedObjectSize() + state->heap().heapStats().markedObjectSize();
|
| - if (gcType != BlinkGC::TakeSnapshot)
|
| - state->heap().resetHeapCounters();
|
| -
|
| - {
|
| - // Access to the CrossThreadPersistentRegion has to be prevented while
|
| - // marking and global weak processing is in progress. If not, threads
|
| - // not attached to Oilpan and participating in this GC are able
|
| - // to allocate & free PersistentNodes, something the marking phase isn't
|
| - // capable of handling.
|
| - CrossThreadPersistentRegion::LockScope persistentLock(ProcessHeap::crossThreadPersistentRegion());
|
| -
|
| - // 1. Trace persistent roots.
|
| - state->heap().visitPersistentRoots(visitor.get());
|
| -
|
| - // 2. Trace objects reachable from the stack. We do this independent of the
|
| - // given stackState since other threads might have a different stack state.
|
| - state->heap().visitStackRoots(visitor.get());
|
| -
|
| - // 3. Transitive closure to trace objects including ephemerons.
|
| - state->heap().processMarkingStack(visitor.get());
|
| -
|
| - state->heap().postMarkingProcessing(visitor.get());
|
| - state->heap().globalWeakProcessing(visitor.get());
|
| - }
|
| -
|
| - // Now we can delete all orphaned pages because there are no dangling
|
| - // pointers to the orphaned pages. (If we have such dangling pointers,
|
| - // we should have crashed during marking before getting here.)
|
| - state->heap().getOrphanedPagePool()->decommitOrphanedPages();
|
| -
|
| - double markingTimeInMilliseconds = WTF::currentTimeMS() - startTime;
|
| - state->heap().heapStats().setEstimatedMarkingTimePerByte(totalObjectSize ? (markingTimeInMilliseconds / 1000 / totalObjectSize) : 0);
|
| -
|
| -#if PRINT_HEAP_STATS
|
| - dataLogF("ThreadHeap::collectGarbage (gcReason=%s, lazySweeping=%d, time=%.1lfms)\n", gcReasonString(reason), gcType == BlinkGC::GCWithoutSweep, markingTimeInMilliseconds);
|
| -#endif
|
| -
|
| - DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, markingTimeHistogram, new CustomCountHistogram("BlinkGC.CollectGarbage", 0, 10 * 1000, 50));
|
| - markingTimeHistogram.count(markingTimeInMilliseconds);
|
| - DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalObjectSpaceHistogram, new CustomCountHistogram("BlinkGC.TotalObjectSpace", 0, 4 * 1024 * 1024, 50));
|
| - totalObjectSpaceHistogram.count(ProcessHeap::totalAllocatedObjectSize() / 1024);
|
| - DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalAllocatedSpaceHistogram, new CustomCountHistogram("BlinkGC.TotalAllocatedSpace", 0, 4 * 1024 * 1024, 50));
|
| - totalAllocatedSpaceHistogram.count(ProcessHeap::totalAllocatedSpace() / 1024);
|
| - DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, gcReasonHistogram, new EnumerationHistogram("BlinkGC.GCReason", BlinkGC::NumberOfGCReason));
|
| - gcReasonHistogram.count(reason);
|
| -
|
| - state->heap().m_lastGCReason = reason;
|
| -
|
| - ThreadHeap::reportMemoryUsageHistogram();
|
| - WTF::Partitions::reportMemoryUsageHistogram();
|
| -
|
| - state->heap().postGC(gcType);
|
| - state->heap().decommitCallbackStacks();
|
| -}
|
| -
|
| -void ThreadHeap::collectGarbageForTerminatingThread(ThreadState* state)
|
| -{
|
| - {
|
| - // A thread-specific termination GC must not allow other global GCs to go
|
| - // ahead while it is running, hence the termination GC does not enter a
|
| - // safepoint. VisitorScope will not enter also a safepoint scope for
|
| - // ThreadTerminationGC.
|
| - std::unique_ptr<Visitor> visitor = Visitor::create(state, BlinkGC::ThreadTerminationGC);
|
| -
|
| - ThreadState::NoAllocationScope noAllocationScope(state);
|
| -
|
| - state->heap().commitCallbackStacks();
|
| - state->preGC();
|
| -
|
| - // 1. Trace the thread local persistent roots. For thread local GCs we
|
| - // don't trace the stack (ie. no conservative scanning) since this is
|
| - // only called during thread shutdown where there should be no objects
|
| - // on the stack.
|
| - // We also assume that orphaned pages have no objects reachable from
|
| - // persistent handles on other threads or CrossThreadPersistents. The
|
| - // only cases where this could happen is if a subsequent conservative
|
| - // global GC finds a "pointer" on the stack or due to a programming
|
| - // error where an object has a dangling cross-thread pointer to an
|
| - // object on this heap.
|
| - state->visitPersistents(visitor.get());
|
| -
|
| - // 2. Trace objects reachable from the thread's persistent roots
|
| - // including ephemerons.
|
| - state->heap().processMarkingStack(visitor.get());
|
| -
|
| - state->heap().postMarkingProcessing(visitor.get());
|
| - state->heap().globalWeakProcessing(visitor.get());
|
| -
|
| - state->postGC(BlinkGC::GCWithSweep);
|
| - state->heap().decommitCallbackStacks();
|
| - }
|
| - state->preSweep();
|
| -}
|
| -
|
| void ThreadHeap::processMarkingStack(Visitor* visitor)
|
| {
|
| // Ephemeron fixed point loop.
|
| @@ -680,20 +524,6 @@ void ThreadHeap::globalWeakProcessing(Visitor* visitor)
|
| globalWeakTimeHistogram.count(timeForGlobalWeakProcessing);
|
| }
|
|
|
| -void ThreadHeap::collectAllGarbage()
|
| -{
|
| - // We need to run multiple GCs to collect a chain of persistent handles.
|
| - size_t previousLiveObjects = 0;
|
| - ThreadState* state = ThreadState::current();
|
| - for (int i = 0; i < 5; ++i) {
|
| - collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC);
|
| - size_t liveObjects = state->heap().heapStats().markedObjectSize();
|
| - if (liveObjects == previousLiveObjects)
|
| - break;
|
| - previousLiveObjects = liveObjects;
|
| - }
|
| -}
|
| -
|
| void ThreadHeap::reportMemoryUsageHistogram()
|
| {
|
| static size_t supportedMaxSizeInMB = 4 * 1024;
|
|
|