Chromium Code Reviews| Index: content/renderer/render_thread_impl.cc |
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
| index eac04476f119927570bed7ef371c9c5af490f3a1..9bcfac4fc617bdcfdb0fe709bd08f5d27ff6961f 100644 |
| --- a/content/renderer/render_thread_impl.cc |
| +++ b/content/renderer/render_thread_impl.cc |
| @@ -160,7 +160,6 @@ |
| #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> |
| @@ -242,6 +241,17 @@ const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024; |
| 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: |
| explicit WebThreadForCompositor(base::Thread::Options options) |
| @@ -348,13 +358,6 @@ void NotifyTimezoneChangeOnThisThread() { |
| v8::Date::DateTimeConfigurationChangeNotification(isolate); |
| } |
| -void LowMemoryNotificationOnThisThread() { |
| - v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| - if (!isolate) |
| - return; |
| - isolate->LowMemoryNotification(); |
| -} |
| - |
| class RenderFrameSetupImpl : public mojom::RenderFrameSetup { |
| public: |
| explicit RenderFrameSetupImpl( |
| @@ -802,7 +805,9 @@ void RenderThreadImpl::Init( |
| #endif |
| memory_pressure_listener_.reset(new base::MemoryPressureListener( |
| - base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)))); |
| + base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)), |
| + base::Bind(&RenderThreadImpl::OnSyncMemoryPressure, |
| + base::Unretained(this)))); |
| int num_raster_threads = 0; |
| std::string string_value = |
| @@ -1978,6 +1983,7 @@ void RenderThreadImpl::OnCreateNewSharedWorker( |
| 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. |
| @@ -1985,19 +1991,6 @@ void RenderThreadImpl::OnMemoryPressure( |
| 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) { |
| // Purge Skia font cache, by setting it to 0 and then again to the |
| @@ -2152,4 +2145,24 @@ void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { |
| 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. |
|
jochen (gone - plz use gerrit)
2016/04/20 12:46:35
foregrou*n*d
hong.zheng
2016/04/21 12:18:04
Done.
|
| + if (!RendererIsHidden() && |
| + v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical) |
|
jochen (gone - plz use gerrit)
2016/04/20 12:46:35
please add { }
hong.zheng
2016/04/21 12:18:04
Done.
|
| + v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate; |
| + |
| + blink::mainThreadIsolate()->MemoryPressureNotification( |
| + v8_memory_pressure_level); |
| + blink::MemoryPressureNotificationToWorkerThreadIsolates( |
| + v8_memory_pressure_level); |
| +} |
| + |
| } // namespace content |