Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2265)

Unified Diff: Source/platform/heap/ThreadState.cpp

Issue 1191483002: Revert of Oilpan: adjust GC policy under memory pressure. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/heap/ThreadState.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/platform/heap/ThreadState.cpp
diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp
index 6922e73080d86c64374966e14b4fd72e86bb5635..566a5d870169535154565190a55428a0391e09f5 100644
--- a/Source/platform/heap/ThreadState.cpp
+++ b/Source/platform/heap/ThreadState.cpp
@@ -532,19 +532,18 @@
if (gcState() != NoGCScheduled)
return false;
#if ENABLE(IDLE_GC)
- // 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 = Heap::estimatedLiveObjectSize() >> 10;
+ size_t estimatedLiveObjectSize = Heap::estimatedLiveObjectSize();
+ size_t allocatedObjectSize = Heap::allocatedObjectSize();
// Heap::markedObjectSize() may be underestimated if any thread has not
// finished completeSweep().
- size_t currentObjectSizeKb = allocatedObjectSizeKb + ((Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages()) >> 10);
+ size_t currentObjectSize = allocatedObjectSize + Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages();
// Schedule an idle 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;
+ return allocatedObjectSize >= 1024 * 1024 && currentObjectSize > estimatedLiveObjectSize * 3 / 2;
#else
return false;
#endif
@@ -559,33 +558,19 @@
#if ENABLE(IDLE_GC)
return false;
#else
- // 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 = Heap::estimatedLiveObjectSize() >> 10;
+ size_t estimatedLiveObjectSize = Heap::estimatedLiveObjectSize();
+ size_t allocatedObjectSize = Heap::allocatedObjectSize();
// Heap::markedObjectSize() may be underestimated if any thread has not
// finished completeSweep().
- size_t currentObjectSizeKb = allocatedObjectSizeKb + ((Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages()) >> 10);
+ size_t currentObjectSize = allocatedObjectSize + Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages();
// 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;
-#endif
-}
-
-bool ThreadState::shouldForceMemoryPressureGC()
-{
- // Avoid potential overflow by truncating to Kb.
- size_t currentObjectSizeKb = (Heap::allocatedObjectSize() + Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages()) >> 10;
- size_t estimatedLiveObjectSizeKb = (Heap::estimatedLiveObjectSize()) >> 10;
- if (currentObjectSizeKb < 300 * 1024)
- return false;
-
- // If we're consuming too much memory, trigger a conservative GC
- // aggressively. This is a safe guard to avoid OOM.
- return currentObjectSizeKb > (estimatedLiveObjectSizeKb * 3) / 2;
+ return allocatedObjectSize >= 1024 * 1024 && currentObjectSize > estimatedLiveObjectSize * 3 / 2;
+#endif
}
// TODO(haraken): We should improve the GC heuristics.
@@ -595,24 +580,24 @@
if (UNLIKELY(isGCForbidden()))
return false;
- if (shouldForceMemoryPressureGC())
- return true;
-
- // 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 = Heap::estimatedLiveObjectSize() >> 10;
+ size_t estimatedLiveObjectSize = Heap::estimatedLiveObjectSize();
+ size_t allocatedObjectSize = Heap::allocatedObjectSize();
// Heap::markedObjectSize() may be underestimated if any thread has not
// finished completeSweep().
- size_t currentObjectSizeKb = allocatedObjectSizeKb + ((Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages()) >> 10);
-
+ size_t currentObjectSize = allocatedObjectSize + Heap::markedObjectSize() + WTF::Partitions::totalSizeOfCommittedPages();
+ if (currentObjectSize >= 300 * 1024 * 1024) {
+ // If we're consuming too much memory, trigger a conservative GC
+ // aggressively. This is a safe guard to avoid OOM.
+ return currentObjectSize > estimatedLiveObjectSize * 3 / 2;
+ }
// Schedule a conservative GC if Oilpan has allocated more than 32 MB since
// the last GC and the current memory usage is >400% larger than
// the estimated live memory usage.
// TODO(haraken): 400% is too large. Lower the heap growing factor.
- return allocatedObjectSizeKb >= 32 * 1024 && currentObjectSizeKb > 5 * estimatedLiveObjectSizeKb;
+ return allocatedObjectSize >= 32 * 1024 * 1024 && currentObjectSize > 5 * estimatedLiveObjectSize;
}
void ThreadState::scheduleGCIfNeeded()
@@ -804,7 +789,7 @@
return m_gcState;
}
-void ThreadState::didV8MajorGC(bool forceGC)
+void ThreadState::didV8GC()
{
checkThread();
if (isMainThread()) {
@@ -812,45 +797,6 @@
// expected to have collected a lot of DOM wrappers and dropped
// references to their DOM objects.
Heap::setEstimatedLiveObjectSize(Heap::estimatedLiveObjectSize() / 2);
-
- if (forceGC) {
- // This single GC is not enough for two reasons:
- // (1) The GC is not precise because the GC scans on-stack pointers conservatively.
- // (2) One GC is not enough to break a chain of persistent handles. It's possible that
- // some heap allocated objects own objects that contain persistent handles
- // pointing to other heap allocated objects. To break the chain, we need multiple GCs.
- //
- // Regarding (1), we force a precise GC at the end of the current event loop. So if you want
- // to collect all garbage, you need to wait until the next event loop.
- // Regarding (2), it would be OK in practice to trigger only one GC per gcEpilogue, because
- // GCController.collectAll() forces 7 V8's GC.
- Heap::collectGarbage(ThreadState::HeapPointersOnStack, ThreadState::GCWithSweep, Heap::ForcedGC);
-
- // Forces a precise GC at the end of the current event loop.
- ThreadState::current()->setGCState(ThreadState::FullGCScheduled);
- return;
- }
-
- // If under memory pressure, complete sweeping before initiating
- // the urgent conservative GC.
- if (shouldForceMemoryPressureGC())
- completeSweep();
-
- // Schedule an Oilpan GC to avoid the following scenario:
- // (1) A DOM object X holds a v8::Persistent to a V8 object.
- // Assume that X is small but the V8 object is huge.
- // The v8::Persistent is released when X is destructed.
- // (2) X's DOM wrapper is created.
- // (3) The DOM wrapper becomes unreachable.
- // (4) V8 triggers a GC. The V8's GC collects the DOM wrapper.
- // However, X is not collected until a next Oilpan's GC is
- // triggered.
- // (5) If a lot of such DOM objects are created, we end up with
- // a situation where V8's GC collects the DOM wrappers but
- // the DOM objects are not collected forever. (Note that
- // Oilpan's GC is not triggered unless Oilpan's heap gets full.)
- // (6) V8 hits OOM.
- scheduleGCIfNeeded();
}
}
« no previous file with comments | « Source/platform/heap/ThreadState.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698