blob: bf336c16ee21536d05efd48bc6e58ee4218fecd3 [file] [log] [blame]
// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/memory/memory_monitor_win.h"
#include "base/process/process_metrics.h"
// TODO(chrisha): Implement a mechanism for observing swapping, and updating the
// memory threshold on a per machine basis.
namespace content {
namespace {
const int kKBperMB = 1024;
// A global static instance of the default delegate. Used by default by
// MemoryMonitorWin.
MemoryMonitorDelegate g_memory_monitor_win_delegate;
} // namespace
// A system is considered 'large memory' if it has more than 1.5GB of system
// memory available for use by the memory manager (not reserved for hardware
// and drivers). This is a fuzzy version of the ~2GB discussed below.
const int MemoryMonitorWin::kLargeMemoryThresholdMB = 1536;
// This is the target free memory used for systems with < ~2GB of physical
// memory. Such systems have been observed to always maintain ~100MB of
// available memory, paging until that is the case. To try to avoid paging a
// threshold slightly above this is chosen.
const int MemoryMonitorWin::kSmallMemoryTargetFreeMB = 200;
// This is the target free memory used for systems with >= ~2GB of physical
// memory. Such systems have been observed to always maintain ~300MB of
// available memory, paging until that is the case.
const int MemoryMonitorWin::kLargeMemoryTargetFreeMB = 400;
MemoryMonitorWin::MemoryMonitorWin(MemoryMonitorDelegate* delegate,
int target_free_mb)
: delegate_(delegate), target_free_mb_(target_free_mb) {}
int MemoryMonitorWin::GetFreeMemoryUntilCriticalMB() {
base::SystemMemoryInfoKB mem_info = {};
delegate_->GetSystemMemoryInfo(&mem_info);
int free_mb = mem_info.avail_phys / kKBperMB;
free_mb -= target_free_mb_;
return free_mb;
}
// static
std::unique_ptr<MemoryMonitorWin> MemoryMonitorWin::Create(
MemoryMonitorDelegate* delegate) {
return std::unique_ptr<MemoryMonitorWin>(new MemoryMonitorWin(
delegate, GetTargetFreeMB(delegate)));
}
// static
bool MemoryMonitorWin::IsLargeMemory(MemoryMonitorDelegate* delegate) {
base::SystemMemoryInfoKB mem_info = {};
delegate->GetSystemMemoryInfo(&mem_info);
return (mem_info.total / kKBperMB) >=
MemoryMonitorWin::kLargeMemoryThresholdMB;
}
// static
int MemoryMonitorWin::GetTargetFreeMB(MemoryMonitorDelegate* delegate) {
if (IsLargeMemory(delegate))
return MemoryMonitorWin::kLargeMemoryTargetFreeMB;
return MemoryMonitorWin::kSmallMemoryTargetFreeMB;
}
// Implementation of factory function defined in memory_monitor.h.
std::unique_ptr<MemoryMonitor> CreateMemoryMonitor() {
return MemoryMonitorWin::Create(&g_memory_monitor_win_delegate);
}
} // namespace content