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

Side by Side Diff: content/renderer/render_thread_impl.cc

Issue 1749073002: Do V8 GC ASAP if system memory is pressured (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update in WorkerBackingThread Created 4 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_thread_impl.h" 5 #include "content/renderer/render_thread_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <map> 9 #include <map>
10 #include <utility> 10 #include <utility>
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 #include "third_party/WebKit/public/web/WebMemoryPressureListener.h" 153 #include "third_party/WebKit/public/web/WebMemoryPressureListener.h"
154 #include "third_party/WebKit/public/web/WebNetworkStateNotifier.h" 154 #include "third_party/WebKit/public/web/WebNetworkStateNotifier.h"
155 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" 155 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
156 #include "third_party/WebKit/public/web/WebScriptController.h" 156 #include "third_party/WebKit/public/web/WebScriptController.h"
157 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" 157 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
158 #include "third_party/WebKit/public/web/WebView.h" 158 #include "third_party/WebKit/public/web/WebView.h"
159 #include "third_party/icu/source/i18n/unicode/timezone.h" 159 #include "third_party/icu/source/i18n/unicode/timezone.h"
160 #include "third_party/skia/include/core/SkGraphics.h" 160 #include "third_party/skia/include/core/SkGraphics.h"
161 #include "ui/base/layout.h" 161 #include "ui/base/layout.h"
162 #include "ui/base/ui_base_switches.h" 162 #include "ui/base/ui_base_switches.h"
163 #include "v8/include/v8.h"
164 163
165 #if defined(OS_ANDROID) 164 #if defined(OS_ANDROID)
166 #include <cpu-features.h> 165 #include <cpu-features.h>
167 #include "content/renderer/android/synchronous_compositor_external_begin_frame_s ource.h" 166 #include "content/renderer/android/synchronous_compositor_external_begin_frame_s ource.h"
168 #include "content/renderer/android/synchronous_compositor_factory.h" 167 #include "content/renderer/android/synchronous_compositor_factory.h"
169 #include "content/renderer/android/synchronous_compositor_filter.h" 168 #include "content/renderer/android/synchronous_compositor_filter.h"
170 #include "content/renderer/media/android/renderer_demuxer_android.h" 169 #include "content/renderer/media/android/renderer_demuxer_android.h"
171 #include "content/renderer/media/android/stream_texture_factory_impl.h" 170 #include "content/renderer/media/android/stream_texture_factory_impl.h"
172 #include "media/base/android/media_codec_util.h" 171 #include "media/base/android/media_codec_util.h"
173 #endif 172 #endif
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 blink::enableLogChannel(t.token().c_str()); 340 blink::enableLogChannel(t.token().c_str());
342 } 341 }
343 342
344 void NotifyTimezoneChangeOnThisThread() { 343 void NotifyTimezoneChangeOnThisThread() {
345 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 344 v8::Isolate* isolate = v8::Isolate::GetCurrent();
346 if (!isolate) 345 if (!isolate)
347 return; 346 return;
348 v8::Date::DateTimeConfigurationChangeNotification(isolate); 347 v8::Date::DateTimeConfigurationChangeNotification(isolate);
349 } 348 }
350 349
351 void LowMemoryNotificationOnThisThread() {
352 v8::Isolate* isolate = v8::Isolate::GetCurrent();
353 if (!isolate)
354 return;
355 isolate->LowMemoryNotification();
356 }
357
358 class RenderFrameSetupImpl : public mojom::RenderFrameSetup { 350 class RenderFrameSetupImpl : public mojom::RenderFrameSetup {
359 public: 351 public:
360 explicit RenderFrameSetupImpl( 352 explicit RenderFrameSetupImpl(
361 mojo::InterfaceRequest<mojom::RenderFrameSetup> request) 353 mojo::InterfaceRequest<mojom::RenderFrameSetup> request)
362 : routing_id_highmark_(-1), binding_(this, std::move(request)) {} 354 : routing_id_highmark_(-1), binding_(this, std::move(request)) {}
363 355
364 void ExchangeInterfaceProviders( 356 void ExchangeInterfaceProviders(
365 int32_t frame_routing_id, 357 int32_t frame_routing_id,
366 shell::mojom::InterfaceProviderRequest services, 358 shell::mojom::InterfaceProviderRequest services,
367 shell::mojom::InterfaceProviderPtr exposed_services) override { 359 shell::mojom::InterfaceProviderPtr exposed_services) override {
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 media::InitializeMediaLibrary(); 787 media::InitializeMediaLibrary();
796 788
797 #if defined(OS_ANDROID) 789 #if defined(OS_ANDROID)
798 if (!command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode) && 790 if (!command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode) &&
799 media::MediaCodecUtil::IsMediaCodecAvailable()) { 791 media::MediaCodecUtil::IsMediaCodecAvailable()) {
800 media::EnablePlatformDecoderSupport(); 792 media::EnablePlatformDecoderSupport();
801 } 793 }
802 #endif 794 #endif
803 795
804 memory_pressure_listener_.reset(new base::MemoryPressureListener( 796 memory_pressure_listener_.reset(new base::MemoryPressureListener(
805 base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)))); 797 base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)),
798 base::Bind(&RenderThreadImpl::OnSyncMemoryPressure,
799 base::Unretained(this))));
806 800
807 int num_raster_threads = 0; 801 int num_raster_threads = 0;
808 std::string string_value = 802 std::string string_value =
809 command_line.GetSwitchValueASCII(switches::kNumRasterThreads); 803 command_line.GetSwitchValueASCII(switches::kNumRasterThreads);
810 bool parsed_num_raster_threads = 804 bool parsed_num_raster_threads =
811 base::StringToInt(string_value, &num_raster_threads); 805 base::StringToInt(string_value, &num_raster_threads);
812 DCHECK(parsed_num_raster_threads) << string_value; 806 DCHECK(parsed_num_raster_threads) << string_value;
813 DCHECK_GT(num_raster_threads, 0); 807 DCHECK_GT(num_raster_threads, 0);
814 808
815 #if defined(OS_ANDROID) 809 #if defined(OS_ANDROID)
(...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 const WorkerProcessMsg_CreateWorker_Params& params) { 1965 const WorkerProcessMsg_CreateWorker_Params& params) {
1972 // EmbeddedSharedWorkerStub will self-destruct. 1966 // EmbeddedSharedWorkerStub will self-destruct.
1973 new EmbeddedSharedWorkerStub( 1967 new EmbeddedSharedWorkerStub(
1974 params.url, params.name, params.content_security_policy, 1968 params.url, params.name, params.content_security_policy,
1975 params.security_policy_type, params.creation_address_space, 1969 params.security_policy_type, params.creation_address_space,
1976 params.pause_on_start, params.route_id); 1970 params.pause_on_start, params.route_id);
1977 } 1971 }
1978 1972
1979 void RenderThreadImpl::OnMemoryPressure( 1973 void RenderThreadImpl::OnMemoryPressure(
1980 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) { 1974 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
1975 TRACE_EVENT0("memory","RenderThreadImpl::OnMemoryPressure");
1981 ReleaseFreeMemory(); 1976 ReleaseFreeMemory();
1982 1977
1983 // Do not call into blink if it is not initialized. 1978 // Do not call into blink if it is not initialized.
1984 if (blink_platform_impl_) { 1979 if (blink_platform_impl_) {
1985 blink::WebMemoryPressureListener::onMemoryPressure( 1980 blink::WebMemoryPressureListener::onMemoryPressure(
1986 static_cast<blink::WebMemoryPressureLevel>(memory_pressure_level)); 1981 static_cast<blink::WebMemoryPressureLevel>(memory_pressure_level));
1987 1982
1988 if (blink::mainThreadIsolate()) {
1989 // Trigger full v8 garbage collection on memory pressure notifications.
1990 // This will potentially hang the renderer for a long time, however, when
1991 // we receive a memory pressure notification, we might be about to be
1992 // killed. Because of the janky hang don't do this to foreground
1993 // renderers.
1994 if (RendererIsHidden()) {
1995 blink::mainThreadIsolate()->LowMemoryNotification();
1996 RenderThread::Get()->PostTaskToAllWebWorkers(
1997 base::Bind(&LowMemoryNotificationOnThisThread));
1998 }
1999 }
2000
2001 if (memory_pressure_level == 1983 if (memory_pressure_level ==
2002 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { 1984 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
2003 // Purge Skia font cache, by setting it to 0 and then again to the 1985 // Purge Skia font cache, by setting it to 0 and then again to the
2004 // previous limit. 1986 // previous limit.
2005 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0); 1987 size_t font_cache_limit = SkGraphics::SetFontCacheLimit(0);
2006 SkGraphics::SetFontCacheLimit(font_cache_limit); 1988 SkGraphics::SetFontCacheLimit(font_cache_limit);
2007 } 1989 }
2008 } 1990 }
2009 } 1991 }
2010 1992
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
2145 RenderThreadImpl::PendingRenderFrameConnect::~PendingRenderFrameConnect() { 2127 RenderThreadImpl::PendingRenderFrameConnect::~PendingRenderFrameConnect() {
2146 } 2128 }
2147 2129
2148 void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() { 2130 void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() {
2149 size_t erased = 2131 size_t erased =
2150 RenderThreadImpl::current()->pending_render_frame_connects_.erase( 2132 RenderThreadImpl::current()->pending_render_frame_connects_.erase(
2151 routing_id_); 2133 routing_id_);
2152 DCHECK_EQ(1u, erased); 2134 DCHECK_EQ(1u, erased);
2153 } 2135 }
2154 2136
2137 void RenderThreadImpl::OnSyncMemoryPressure(
2138 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
2139 if (blink::mainThreadIsolate()) {
esprehn 2016/04/18 21:57:59 early return instead of indenting the entire funct
hong.zheng 2016/04/19 06:27:43 Done.
2140 static_assert(
2141 static_cast<v8::MemoryPressureLevel>(
2142 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) ==
esprehn 2016/04/18 21:57:59 these static_asserts should just be in a block at
hong.zheng 2016/04/19 06:27:43 Done.
2143 v8::MemoryPressureLevel::kNone, "none level not align");
2144 static_assert(
2145 static_cast<v8::MemoryPressureLevel>(
2146 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) ==
2147 v8::MemoryPressureLevel::kModerate, "moderate level not align");
2148 static_assert(
2149 static_cast<v8::MemoryPressureLevel>(
2150 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) ==
2151 v8::MemoryPressureLevel::kCritical, "critical level not align");
2152
2153 v8::MemoryPressureLevel v8_memory_pressure_level =
2154 static_cast<v8::MemoryPressureLevel>(memory_pressure_level);
2155
2156 if (!RendererIsHidden()) {
2157 if (v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical)
esprehn 2016/04/18 21:57:58 combine the if statements, doing: if (x) { if (
hong.zheng 2016/04/19 06:27:43 Done.
2158 // In order to reduce performance impact, translate critical level to
2159 // moderate level for foregroud renderer.
2160 v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate;
2161 }
2162
2163 blink::mainThreadIsolate()->MemoryPressureNotification(
2164 v8_memory_pressure_level);
2165 blink::MemoryPressureNotificationToWorkerThreadIsolates(
2166 v8_memory_pressure_level);
2167 }
2168 }
2169
2155 } // namespace content 2170 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698