Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/V8GCForContextDispose.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/V8GCForContextDispose.cpp b/third_party/WebKit/Source/bindings/core/v8/V8GCForContextDispose.cpp |
| index deca64c5ee5773498a32c574de0a5dbd4732bfce..7b5fc96c95624522346826ad9ad42c131eb375da 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/V8GCForContextDispose.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/V8GCForContextDispose.cpp |
| @@ -30,12 +30,26 @@ |
| #include "bindings/core/v8/V8GCForContextDispose.h" |
| +#include "platform/Histogram.h" |
| +#include "platform/MemoryCoordinator.h" |
| #include "platform/bindings/V8PerIsolateData.h" |
| #include "platform/wtf/CurrentTime.h" |
| +#include "platform/wtf/ProcessMetrics.h" |
| #include "platform/wtf/StdLibExtras.h" |
| #include "public/platform/Platform.h" |
| #include "v8/include/v8.h" |
| +size_t GetMemoryUsage() { |
| + size_t usage = WTF::GetMallocUsage() + WTF::Partitions::TotalActiveBytes() + |
| + blink::ProcessHeap::TotalAllocatedObjectSize() + |
| + blink::ProcessHeap::TotalMarkedObjectSize(); |
| + v8::HeapStatistics v8_heap_statistics; |
| + blink::V8PerIsolateData::MainThreadIsolate()->GetHeapStatistics( |
| + &v8_heap_statistics); |
| + usage = v8_heap_statistics.total_heap_size(); |
| + return usage; |
| +} |
| + |
| namespace blink { |
| V8GCForContextDispose::V8GCForContextDispose() |
| @@ -43,9 +57,29 @@ V8GCForContextDispose::V8GCForContextDispose() |
| Reset(); |
| } |
| -void V8GCForContextDispose::NotifyContextDisposed(bool is_main_frame) { |
| +void V8GCForContextDispose::NotifyContextDisposed( |
| + bool is_main_frame, |
| + WindowProxy::FrameReuseStatus frame_reuse_status) { |
| did_dispose_context_for_main_frame_ = is_main_frame; |
| last_context_disposal_time_ = WTF::CurrentTime(); |
| +#if OS(ANDROID) |
| + // When a low end device is in a low memory situation we should prioritize |
| + // memory use and trigger a V8+Blink GC. However, on Android, if the frame |
| + // will not be reused, the process will likely to be killed soon so skip this. |
| + if (is_main_frame && frame_reuse_status == WindowProxy::kFrameWillBeReused && |
| + MemoryCoordinator::IsLowEndDevice() && |
| + MemoryCoordinator::IsCurrentlyLowMemory()) { |
| + size_t pre_gc_memory_usage = GetMemoryUsage(); |
| + V8PerIsolateData::MainThreadIsolate()->MemoryPressureNotification( |
| + v8::MemoryPressureLevel::kCritical); |
| + size_t post_gc_memory_usage = GetMemoryUsage(); |
| + int reduction = static_cast<int>(pre_gc_memory_usage) - |
| + static_cast<int>(post_gc_memory_usage); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, reduction_histogram, |
| + ("LowMemoryPageNavigationGC.Reduction", 0, 512, 50)); |
|
Ilya Sherman
2017/06/26 18:48:37
nit: 0 is not a valid histogram min; please use 1
keishi
2017/06/27 03:44:53
Done.
FYI looks like we don't have a DCHECK yet h
Ilya Sherman
2017/06/27 03:48:44
Ah, I guess I misremembered. Thanks for pointing
|
| + reduction_histogram.Count(reduction / 1024 / 1024); |
| + } |
| +#endif |
| V8PerIsolateData::MainThreadIsolate()->ContextDisposedNotification( |
| !is_main_frame); |
| pseudo_idle_timer_.Stop(); |