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 "base/trace_event/malloc_dump_provider.h" | 5 #include "base/trace_event/malloc_dump_provider.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/allocator/allocator_extension.h" | 9 #include "base/allocator/allocator_extension.h" |
10 #include "base/allocator/allocator_shim.h" | 10 #include "base/allocator/allocator_shim.h" |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 DCHECK(res); | 209 DCHECK(res); |
210 res = allocator::GetNumericProperty("generic.current_allocated_bytes", | 210 res = allocator::GetNumericProperty("generic.current_allocated_bytes", |
211 &allocated_objects_size); | 211 &allocated_objects_size); |
212 DCHECK(res); | 212 DCHECK(res); |
213 #elif defined(OS_MACOSX) || defined(OS_IOS) | 213 #elif defined(OS_MACOSX) || defined(OS_IOS) |
214 malloc_statistics_t stats = {0}; | 214 malloc_statistics_t stats = {0}; |
215 malloc_zone_statistics(nullptr, &stats); | 215 malloc_zone_statistics(nullptr, &stats); |
216 total_virtual_size = stats.size_allocated; | 216 total_virtual_size = stats.size_allocated; |
217 allocated_objects_size = stats.size_in_use; | 217 allocated_objects_size = stats.size_in_use; |
218 | 218 |
219 // The resident size is approximated to the max size in use, which would count | 219 // Resident size is approximated pretty well by stats.max_size_in_use. |
220 // the total size of all regions other than the free bytes at the end of each | 220 // However, on macOS, freed blocks are both resident and reusable, which is |
221 // region. In each allocation region the allocations are rounded off to a | 221 // semantically equivalent to deallocated. The implementation of libmalloc |
222 // fixed quantum, so the excess region will not be resident. | 222 // will also only hold a fixed number of freed regions before actually |
223 // See crrev.com/1531463004 for detailed explanation. | 223 // starting to deallocate them, so stats.max_size_in_use is also not |
224 resident_size = stats.max_size_in_use; | 224 // representative of the peak size. As a result, stats.max_size_in_use is |
| 225 // typically somewhere between actually resident [non-reusable] pages, and |
| 226 // peak size. This is not very useful, so we just use stats.size_in_use for |
| 227 // resident_size, even though it's an underestimate and fails to account for |
| 228 // fragmentation. See |
| 229 // https://bugs.chromium.org/p/chromium/issues/detail?id=695263#c1. |
| 230 resident_size = stats.size_in_use; |
225 #elif defined(OS_WIN) | 231 #elif defined(OS_WIN) |
226 WinHeapInfo main_heap_info = {}; | 232 WinHeapInfo main_heap_info = {}; |
227 WinHeapMemoryDumpImpl(&main_heap_info); | 233 WinHeapMemoryDumpImpl(&main_heap_info); |
228 total_virtual_size = | 234 total_virtual_size = |
229 main_heap_info.committed_size + main_heap_info.uncommitted_size; | 235 main_heap_info.committed_size + main_heap_info.uncommitted_size; |
230 // Resident size is approximated with committed heap size. Note that it is | 236 // Resident size is approximated with committed heap size. Note that it is |
231 // possible to do this with better accuracy on windows by intersecting the | 237 // possible to do this with better accuracy on windows by intersecting the |
232 // working set with the virtual memory ranges occuipied by the heap. It's not | 238 // working set with the virtual memory ranges occuipied by the heap. It's not |
233 // clear that this is worth it, as it's fairly expensive to do. | 239 // clear that this is worth it, as it's fairly expensive to do. |
234 resident_size = main_heap_info.committed_size; | 240 resident_size = main_heap_info.committed_size; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 tid_dumping_heap_ == PlatformThread::CurrentId()) | 369 tid_dumping_heap_ == PlatformThread::CurrentId()) |
364 return; | 370 return; |
365 AutoLock lock(allocation_register_lock_); | 371 AutoLock lock(allocation_register_lock_); |
366 if (!allocation_register_) | 372 if (!allocation_register_) |
367 return; | 373 return; |
368 allocation_register_->Remove(address); | 374 allocation_register_->Remove(address); |
369 } | 375 } |
370 | 376 |
371 } // namespace trace_event | 377 } // namespace trace_event |
372 } // namespace base | 378 } // namespace base |
OLD | NEW |