Always open bookmarks in incognito mode in the foreground
[chromium-blink-merge.git] / gin / v8_isolate_memory_dump_provider.cc
blob4530879a7969233c103baa1acad96a0b749d7720
1 // Copyright 2015 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.
5 #include "gin/v8_isolate_memory_dump_provider.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/stringprintf.h"
9 #include "base/thread_task_runner_handle.h"
10 #include "base/trace_event/memory_dump_manager.h"
11 #include "base/trace_event/process_memory_dump.h"
12 #include "gin/public/isolate_holder.h"
13 #include "v8/include/v8.h"
15 namespace gin {
17 namespace {
18 const char kRootDumpName[] = "v8";
19 const char kIsolateDumpName[] = "isolate";
20 const char kHeapSpacesDumpName[] = "heap_spaces";
21 const char kAvailableSizeAttribute[] = "available_size_in_bytes";
22 } // namespace
24 V8IsolateMemoryDumpProvider::V8IsolateMemoryDumpProvider(
25 IsolateHolder* isolate_holder)
26 : isolate_holder_(isolate_holder) {
27 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
28 this, base::ThreadTaskRunnerHandle::Get());
31 V8IsolateMemoryDumpProvider::~V8IsolateMemoryDumpProvider() {
32 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
33 this);
36 // Called at trace dump point time. Creates a snapshot with the memory counters
37 // for the current isolate.
38 bool V8IsolateMemoryDumpProvider::OnMemoryDump(
39 base::trace_event::ProcessMemoryDump* pmd) {
40 if (isolate_holder_->access_mode() == IsolateHolder::kUseLocker) {
41 v8::Locker locked(isolate_holder_->isolate());
42 DumpMemoryStatistics(pmd);
43 } else {
44 DumpMemoryStatistics(pmd);
46 return true;
49 void V8IsolateMemoryDumpProvider::DumpMemoryStatistics(
50 base::trace_event::ProcessMemoryDump* pmd) {
51 v8::HeapStatistics heap_statistics;
52 isolate_holder_->isolate()->GetHeapStatistics(&heap_statistics);
54 size_t known_spaces_used_size = 0;
55 size_t known_spaces_size = 0;
56 size_t number_of_spaces = isolate_holder_->isolate()->NumberOfHeapSpaces();
57 for (size_t space = 0; space < number_of_spaces; space++) {
58 v8::HeapSpaceStatistics space_statistics;
59 isolate_holder_->isolate()->GetHeapSpaceStatistics(&space_statistics,
60 space);
61 const size_t space_size = space_statistics.space_size();
62 const size_t space_used_size = space_statistics.space_used_size();
64 known_spaces_size += space_size;
65 known_spaces_used_size += space_used_size;
67 std::string allocator_name =
68 base::StringPrintf("%s/%s_%p/%s/%s", kRootDumpName, kIsolateDumpName,
69 isolate_holder_->isolate(), kHeapSpacesDumpName,
70 space_statistics.space_name());
71 base::trace_event::MemoryAllocatorDump* space_dump =
72 pmd->CreateAllocatorDump(allocator_name);
73 space_dump->AddScalar(
74 base::trace_event::MemoryAllocatorDump::kNameOuterSize,
75 base::trace_event::MemoryAllocatorDump::kUnitsBytes, space_size);
77 // TODO(ssid): Fix crbug.com/481504 to get the objects count of live objects
78 // after the last GC.
79 space_dump->AddScalar(
80 base::trace_event::MemoryAllocatorDump::kNameInnerSize,
81 base::trace_event::MemoryAllocatorDump::kUnitsBytes, space_used_size);
82 space_dump->AddScalar(kAvailableSizeAttribute,
83 base::trace_event::MemoryAllocatorDump::kUnitsBytes,
84 space_statistics.space_available_size());
86 // Compute the rest of the memory, not accounted by the spaces above.
87 std::string allocator_name = base::StringPrintf(
88 "%s/%s_%p/%s/%s", kRootDumpName, kIsolateDumpName,
89 isolate_holder_->isolate(), kHeapSpacesDumpName, "other_spaces");
90 base::trace_event::MemoryAllocatorDump* other_spaces_dump =
91 pmd->CreateAllocatorDump(allocator_name);
92 other_spaces_dump->AddScalar(
93 base::trace_event::MemoryAllocatorDump::kNameOuterSize,
94 base::trace_event::MemoryAllocatorDump::kUnitsBytes,
95 heap_statistics.total_heap_size() - known_spaces_size);
96 other_spaces_dump->AddScalar(
97 base::trace_event::MemoryAllocatorDump::kNameInnerSize,
98 base::trace_event::MemoryAllocatorDump::kUnitsBytes,
99 heap_statistics.used_heap_size() - known_spaces_used_size);
101 // TODO(ssid): Fix crbug.com/481504 to get the total available size of the
102 // heap.
103 other_spaces_dump->AddScalar(
104 kAvailableSizeAttribute,
105 base::trace_event::MemoryAllocatorDump::kUnitsBytes, 0);
108 } // namespace gin