Index: webkit/glue/webkitplatformsupport_impl.cc |
diff --git a/webkit/glue/webkitplatformsupport_impl.cc b/webkit/glue/webkitplatformsupport_impl.cc |
index 7b7ab157875b2f29e8c8bed55605ed95fdf579c7..3398a8ba94587728bdadf660456469b7cd694779 100644 |
--- a/webkit/glue/webkitplatformsupport_impl.cc |
+++ b/webkit/glue/webkitplatformsupport_impl.cc |
@@ -37,6 +37,9 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h" |
+#if defined(OS_ANDROID) |
+#include "webkit/glue/dalvik_heap_size_android.h" |
+#endif |
#include "webkit/glue/webkit_glue.h" |
#include "webkit/glue/websocketstreamhandle_impl.h" |
#include "webkit/glue/webthread_impl.h" |
@@ -620,8 +623,8 @@ WebKit::WebString WebKitPlatformSupportImpl::signedPublicKeyAndChallengeString( |
return WebKit::WebString(""); |
} |
-#if defined(OS_LINUX) |
-static size_t memoryUsageMBLinux() { |
+#if defined(OS_LINUX) || defined(OS_ANDROID) |
+static size_t memoryUsageMB() { |
struct mallinfo minfo = mallinfo(); |
uint64_t mem_usage = |
#if defined(USE_TCMALLOC) |
@@ -635,10 +638,8 @@ static size_t memoryUsageMBLinux() { |
v8::V8::GetHeapStatistics(&stat); |
return mem_usage + (static_cast<uint64_t>(stat.total_heap_size()) >> 20); |
} |
-#endif |
- |
-#if defined(OS_MACOSX) |
-static size_t memoryUsageMBMac() { |
+#elif defined(OS_MACOSX) |
+static size_t memoryUsageMB() { |
using base::ProcessMetrics; |
static ProcessMetrics* process_metrics = |
// The default port provider is sufficient to get data for the current |
@@ -648,10 +649,8 @@ static size_t memoryUsageMBMac() { |
DCHECK(process_metrics); |
return process_metrics->GetWorkingSetSize() >> 20; |
} |
-#endif |
- |
-#if !defined(OS_LINUX) && !defined(OS_MACOSX) |
-static size_t memoryUsageMBGeneric() { |
+#else |
+static size_t memoryUsageMB() { |
using base::ProcessMetrics; |
static ProcessMetrics* process_metrics = |
ProcessMetrics::CreateProcessMetrics(base::GetCurrentProcessHandle()); |
@@ -667,14 +666,7 @@ static size_t getMemoryUsageMB(bool bypass_cache) { |
mem_usage_cache_singleton->IsCachedValueValid(¤t_mem_usage)) |
return current_mem_usage; |
- current_mem_usage = |
-#if defined(OS_LINUX) |
- memoryUsageMBLinux(); |
-#elif defined(OS_MACOSX) |
- memoryUsageMBMac(); |
-#else |
- memoryUsageMBGeneric(); |
-#endif |
+ current_mem_usage = memoryUsageMB(); |
mem_usage_cache_singleton->SetMemoryValue(current_mem_usage); |
return current_mem_usage; |
} |
@@ -687,6 +679,28 @@ size_t WebKitPlatformSupportImpl::actualMemoryUsageMB() { |
return getMemoryUsageMB(true); |
} |
+#if defined(OS_ANDROID) |
+size_t WebKitPlatformSupportImpl::lowMemoryUsageMB() { |
+ // If memory usage is below this threshold, do not bother forcing GC. |
+ // Allow us to use up to our memory class value before V8's GC kicks in. |
+ // These values have been determined by experimentation. |
+ DalvikHeapSize* heap_size_singleton = DalvikHeapSize::GetInstance(); |
+ return heap_size_singleton->HeapSizeMB() / 4; |
+} |
+ |
+size_t WebKitPlatformSupportImpl::highMemoryUsageMB() { |
+ // If memory usage is above this threshold, force GC more aggressively. |
+ return lowMemoryUsageMB() * 2; |
+} |
+ |
+size_t WebKitPlatformSupportImpl::highUsageDeltaMB() { |
+ // Threshold of delta of memory usage growth (vs. last working set estimate) |
+ // to force GC when memory usage is high. |
+ // Avoid constant V8 GC when memory usage equals to working set estimate. |
+ return lowMemoryUsageMB() / 2; |
+} |
+#endif |
+ |
void WebKitPlatformSupportImpl::SuspendSharedTimer() { |
++shared_timer_suspended_; |
} |