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"
18 const char kRootDumpName
[] = "v8";
19 const char kIsolateDumpName
[] = "isolate";
20 const char kHeapSpacesDumpName
[] = "heap_spaces";
21 const char kAvailableSizeAttribute
[] = "available_size_in_bytes";
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(
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
);
44 DumpMemoryStatistics(pmd
);
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 known_spaces_available_size
= 0;
57 size_t number_of_spaces
= isolate_holder_
->isolate()->NumberOfHeapSpaces();
58 for (size_t space
= 0; space
< number_of_spaces
; space
++) {
59 v8::HeapSpaceStatistics space_statistics
;
60 isolate_holder_
->isolate()->GetHeapSpaceStatistics(&space_statistics
,
62 const size_t space_size
= space_statistics
.space_size();
63 const size_t space_used_size
= space_statistics
.space_used_size();
64 size_t space_available_size
= space_statistics
.space_available_size();
66 known_spaces_size
+= space_size
;
67 known_spaces_used_size
+= space_used_size
;
68 known_spaces_available_size
+= space_available_size
;
70 std::string allocator_name
=
71 base::StringPrintf("%s/%s_%p/%s/%s", kRootDumpName
, kIsolateDumpName
,
72 isolate_holder_
->isolate(), kHeapSpacesDumpName
,
73 space_statistics
.space_name());
74 base::trace_event::MemoryAllocatorDump
* space_dump
=
75 pmd
->CreateAllocatorDump(allocator_name
);
76 space_dump
->AddScalar(
77 base::trace_event::MemoryAllocatorDump::kNameOuterSize
,
78 base::trace_event::MemoryAllocatorDump::kUnitsBytes
, space_size
);
80 space_dump
->AddScalar(
81 base::trace_event::MemoryAllocatorDump::kNameInnerSize
,
82 base::trace_event::MemoryAllocatorDump::kUnitsBytes
, space_used_size
);
83 space_dump
->AddScalar(kAvailableSizeAttribute
,
84 base::trace_event::MemoryAllocatorDump::kUnitsBytes
,
85 space_available_size
);
87 // Compute the rest of the memory, not accounted by the spaces above.
88 std::string allocator_name
= base::StringPrintf(
89 "%s/%s_%p/%s/%s", kRootDumpName
, kIsolateDumpName
,
90 isolate_holder_
->isolate(), kHeapSpacesDumpName
, "other_spaces");
91 base::trace_event::MemoryAllocatorDump
* other_spaces_dump
=
92 pmd
->CreateAllocatorDump(allocator_name
);
93 other_spaces_dump
->AddScalar(
94 base::trace_event::MemoryAllocatorDump::kNameOuterSize
,
95 base::trace_event::MemoryAllocatorDump::kUnitsBytes
,
96 heap_statistics
.total_heap_size() - known_spaces_size
);
97 other_spaces_dump
->AddScalar(
98 base::trace_event::MemoryAllocatorDump::kNameInnerSize
,
99 base::trace_event::MemoryAllocatorDump::kUnitsBytes
,
100 heap_statistics
.used_heap_size() - known_spaces_used_size
);
102 // TODO(ssid): Fix crbug.com/481504 to get the total available size of the
104 other_spaces_dump
->AddScalar(
105 kAvailableSizeAttribute
,
106 base::trace_event::MemoryAllocatorDump::kUnitsBytes
,
107 heap_statistics
.total_available_size() - known_spaces_available_size
);