• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "content/child/content_child_helpers.h"
6 
7 #if defined(OS_LINUX)
8 #include <malloc.h>
9 #endif
10 
11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/process/process_metrics.h"
14 #include "v8/include/v8.h"
15 
16 namespace content {
17 
18 #if defined(OS_LINUX) || defined(OS_ANDROID)
GetMemoryUsageKB()19 size_t GetMemoryUsageKB() {
20   struct mallinfo minfo = mallinfo();
21   uint64_t mem_usage =
22 #if defined(USE_TCMALLOC)
23       minfo.uordblks
24 #else
25       (minfo.hblkhd + minfo.arena)
26 #endif
27       >> 10;
28 
29   v8::HeapStatistics stat;
30   // TODO(svenpanne) The call below doesn't take web workers into account, this
31   // has to be done manually by iterating over all Isolates involved.
32   v8::Isolate* isolate = v8::Isolate::GetCurrent();
33   if (isolate)
34     isolate->GetHeapStatistics(&stat);
35   return mem_usage + (static_cast<uint64_t>(stat.total_heap_size()) >> 10);
36 }
37 #elif defined(OS_MACOSX)
38 size_t GetMemoryUsageKB() {
39   scoped_ptr<base::ProcessMetrics> process_metrics(
40       // The default port provider is sufficient to get data for the current
41       // process.
42       base::ProcessMetrics::CreateProcessMetrics(
43           base::GetCurrentProcessHandle(), NULL));
44   return process_metrics->GetWorkingSetSize() >> 10;
45 }
46 #else
47 size_t GetMemoryUsageKB() {
48   scoped_ptr<base::ProcessMetrics> process_metrics(
49       base::ProcessMetrics::CreateProcessMetrics(
50           base::GetCurrentProcessHandle()));
51   return process_metrics->GetPagefileUsage() >> 10;
52 }
53 #endif
54 
55 }  // namespace content
56