Index: content/renderer/render_thread_impl.cc |
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
index 648ac5128c2e7591af92b4c70b3456027cd6088c..fdba7c596ae48e0f141bcbae111a34a971994741 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -161,6 +161,7 @@ |
#include "third_party/skia/include/core/SkGraphics.h" |
#include "ui/base/layout.h" |
#include "ui/base/ui_base_switches.h" |
+#include "v8/include/v8.h" |
#if defined(OS_ANDROID) |
#include <cpu-features.h> |
@@ -240,17 +241,6 @@ |
// incorrectly from the wrong thread. |
base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> > |
lazy_tls = LAZY_INSTANCE_INITIALIZER; |
- |
-// v8::MemoryPressureLevel should correspond to base::MemoryPressureListener. |
-static_assert(static_cast<v8::MemoryPressureLevel>( |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) == |
- v8::MemoryPressureLevel::kNone, "none level not align"); |
-static_assert(static_cast<v8::MemoryPressureLevel>( |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) == |
- v8::MemoryPressureLevel::kModerate, "moderate level not align"); |
-static_assert(static_cast<v8::MemoryPressureLevel>( |
- base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) == |
- v8::MemoryPressureLevel::kCritical, "critical level not align"); |
class WebThreadForCompositor : public WebThreadImplForWorkerScheduler { |
public: |
@@ -356,6 +346,13 @@ |
if (!isolate) |
return; |
v8::Date::DateTimeConfigurationChangeNotification(isolate); |
+} |
+ |
+void LowMemoryNotificationOnThisThread() { |
+ v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
+ if (!isolate) |
+ return; |
+ isolate->LowMemoryNotification(); |
} |
class RenderFrameSetupImpl : public mojom::RenderFrameSetup { |
@@ -826,9 +823,7 @@ |
#endif |
memory_pressure_listener_.reset(new base::MemoryPressureListener( |
- base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)), |
- base::Bind(&RenderThreadImpl::OnSyncMemoryPressure, |
- base::Unretained(this)))); |
+ base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)))); |
int num_raster_threads = 0; |
std::string string_value = |
@@ -1936,13 +1931,25 @@ |
void RenderThreadImpl::OnMemoryPressure( |
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { |
- TRACE_EVENT0("memory","RenderThreadImpl::OnMemoryPressure"); |
ReleaseFreeMemory(); |
// Do not call into blink if it is not initialized. |
if (blink_platform_impl_) { |
blink::WebMemoryPressureListener::onMemoryPressure( |
static_cast<blink::WebMemoryPressureLevel>(memory_pressure_level)); |
+ |
+ if (blink::mainThreadIsolate()) { |
+ // Trigger full v8 garbage collection on memory pressure notifications. |
+ // This will potentially hang the renderer for a long time, however, when |
+ // we receive a memory pressure notification, we might be about to be |
+ // killed. Because of the janky hang don't do this to foreground |
+ // renderers. |
+ if (RendererIsHidden()) { |
+ blink::mainThreadIsolate()->LowMemoryNotification(); |
+ RenderThread::Get()->PostTaskToAllWebWorkers( |
+ base::Bind(&LowMemoryNotificationOnThisThread)); |
+ } |
+ } |
if (memory_pressure_level == |
base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { |
@@ -2104,24 +2111,4 @@ |
DCHECK_EQ(1u, erased); |
} |
-void RenderThreadImpl::OnSyncMemoryPressure( |
- base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { |
- if (!blink::mainThreadIsolate()) |
- return; |
- |
- v8::MemoryPressureLevel v8_memory_pressure_level = |
- static_cast<v8::MemoryPressureLevel>(memory_pressure_level); |
- |
- // In order to reduce performance impact, translate critical level to |
- // moderate level for foregroud renderer. |
- if (!RendererIsHidden() && |
- v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical) |
- v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate; |
- |
- blink::mainThreadIsolate()->MemoryPressureNotification( |
- v8_memory_pressure_level); |
- blink::MemoryPressureNotificationToWorkerThreadIsolates( |
- v8_memory_pressure_level); |
-} |
- |
} // namespace content |