OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gin/v8_isolate_memory_dump_provider.h" | 5 #include "gin/v8_isolate_memory_dump_provider.h" |
6 | 6 |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "base/thread_task_runner_handle.h" | 8 #include "base/thread_task_runner_handle.h" |
9 #include "base/trace_event/memory_dump_manager.h" | 9 #include "base/trace_event/memory_dump_manager.h" |
10 #include "base/trace_event/process_memory_dump.h" | 10 #include "base/trace_event/process_memory_dump.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 // Called at trace dump point time. Creates a snapshot with the memory counters | 28 // Called at trace dump point time. Creates a snapshot with the memory counters |
29 // for the current isolate. | 29 // for the current isolate. |
30 bool V8IsolateMemoryDumpProvider::OnMemoryDump( | 30 bool V8IsolateMemoryDumpProvider::OnMemoryDump( |
31 const base::trace_event::MemoryDumpArgs& args, | 31 const base::trace_event::MemoryDumpArgs& args, |
32 base::trace_event::ProcessMemoryDump* process_memory_dump) { | 32 base::trace_event::ProcessMemoryDump* process_memory_dump) { |
33 // TODO(ssid): Use MemoryDumpArgs to create light dumps when requested | 33 // TODO(ssid): Use MemoryDumpArgs to create light dumps when requested |
34 // (crbug.com/499731). | 34 // (crbug.com/499731). |
35 | 35 |
36 if (isolate_holder_->access_mode() == IsolateHolder::kUseLocker) { | 36 if (isolate_holder_->access_mode() == IsolateHolder::kUseLocker) { |
37 v8::Locker locked(isolate_holder_->isolate()); | 37 v8::Locker locked(isolate_holder_->isolate()); |
38 DumpHeapStatistics(process_memory_dump); | 38 DumpHeapStatistics(args, process_memory_dump); |
39 } else { | 39 } else { |
40 DumpHeapStatistics(process_memory_dump); | 40 DumpHeapStatistics(args, process_memory_dump); |
41 } | 41 } |
42 return true; | 42 return true; |
43 } | 43 } |
44 | 44 |
45 void V8IsolateMemoryDumpProvider::DumpHeapStatistics( | 45 void V8IsolateMemoryDumpProvider::DumpHeapStatistics( |
| 46 const base::trace_event::MemoryDumpArgs& args, |
46 base::trace_event::ProcessMemoryDump* process_memory_dump) { | 47 base::trace_event::ProcessMemoryDump* process_memory_dump) { |
47 std::string dump_base_name = | 48 std::string dump_base_name = |
48 base::StringPrintf("v8/isolate_%p", isolate_holder_->isolate()); | 49 base::StringPrintf("v8/isolate_%p", isolate_holder_->isolate()); |
49 | 50 |
50 // Dump statistics of the heap's spaces. | 51 // Dump statistics of the heap's spaces. |
51 std::string space_name_prefix = dump_base_name + "/heap_spaces"; | 52 std::string space_name_prefix = dump_base_name + "/heap_spaces"; |
52 v8::HeapStatistics heap_statistics; | 53 v8::HeapStatistics heap_statistics; |
53 isolate_holder_->isolate()->GetHeapStatistics(&heap_statistics); | 54 isolate_holder_->isolate()->GetHeapStatistics(&heap_statistics); |
54 | 55 |
55 size_t known_spaces_used_size = 0; | 56 size_t known_spaces_used_size = 0; |
(...skipping 30 matching lines...) Expand all Loading... |
86 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | 87 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
87 heap_statistics.total_heap_size() - known_spaces_size); | 88 heap_statistics.total_heap_size() - known_spaces_size); |
88 | 89 |
89 auto other_allocated_dump = process_memory_dump->CreateAllocatorDump( | 90 auto other_allocated_dump = process_memory_dump->CreateAllocatorDump( |
90 other_spaces_name + "/allocated_objects"); | 91 other_spaces_name + "/allocated_objects"); |
91 other_allocated_dump->AddScalar( | 92 other_allocated_dump->AddScalar( |
92 base::trace_event::MemoryAllocatorDump::kNameSize, | 93 base::trace_event::MemoryAllocatorDump::kNameSize, |
93 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | 94 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
94 heap_statistics.used_heap_size() - known_spaces_used_size); | 95 heap_statistics.used_heap_size() - known_spaces_used_size); |
95 | 96 |
| 97 // If light dump is requested, then object statistics are not dumped |
| 98 if (args.level_of_detail == |
| 99 base::trace_event::MemoryDumpArgs::LevelOfDetail::LOW) |
| 100 return; |
| 101 |
96 // Dump statistics of the heap's live objects from last GC. | 102 // Dump statistics of the heap's live objects from last GC. |
97 std::string object_name_prefix = dump_base_name + "/heap_objects"; | 103 std::string object_name_prefix = dump_base_name + "/heap_objects"; |
98 bool did_dump_object_stats = false; | 104 bool did_dump_object_stats = false; |
99 const size_t object_types = | 105 const size_t object_types = |
100 isolate_holder_->isolate()->NumberOfTrackedHeapObjectTypes(); | 106 isolate_holder_->isolate()->NumberOfTrackedHeapObjectTypes(); |
101 for (size_t type_index = 0; type_index < object_types; type_index++) { | 107 for (size_t type_index = 0; type_index < object_types; type_index++) { |
102 v8::HeapObjectStatistics object_statistics; | 108 v8::HeapObjectStatistics object_statistics; |
103 if (!isolate_holder_->isolate()->GetHeapObjectStatisticsAtLastGC( | 109 if (!isolate_holder_->isolate()->GetHeapObjectStatisticsAtLastGC( |
104 &object_statistics, type_index)) | 110 &object_statistics, type_index)) |
105 continue; | 111 continue; |
(...skipping 25 matching lines...) Expand all Loading... |
131 } | 137 } |
132 | 138 |
133 if (did_dump_object_stats) { | 139 if (did_dump_object_stats) { |
134 process_memory_dump->AddOwnershipEdge( | 140 process_memory_dump->AddOwnershipEdge( |
135 process_memory_dump->CreateAllocatorDump(object_name_prefix)->guid(), | 141 process_memory_dump->CreateAllocatorDump(object_name_prefix)->guid(), |
136 process_memory_dump->CreateAllocatorDump(space_name_prefix)->guid()); | 142 process_memory_dump->CreateAllocatorDump(space_name_prefix)->guid()); |
137 } | 143 } |
138 } | 144 } |
139 | 145 |
140 } // namespace gin | 146 } // namespace gin |
OLD | NEW |