如何通过Allocator按模块追踪C++内存分配?
大型C++程序单模块内存消耗分析方案疑问
我有一个大量依赖标准库和C风格malloc分配内存的大型C++程序,需要分析单个模块的内存消耗情况。简单来说,Mgrx都是包含大量标准库及自定义类字段的复杂类,我想统计Module1的内存占用,且希望尽可能减少手动修改代码的操作。
struct Mgr1; struct Mgr2; struct Mgr3; struct Module1 { vector<Mgr1> v1; vector<Mgr1> v3; ... }; struct Module2 { vector<Mgr1> v2; vector<Mgr1> v3; };
已知的工具思路
- Jemalloc:可通过
thread.allocatedp按线程追踪内存分配,适合程序按线程池划分模块(各模块用专属线程池处理请求、通过消息通信)的场景。 - mmap/sbrk:我已完全弃用直接调用mmap或sbrk分配内存,所有内存分配均委托给Jemalloc。
- Jemalloc的arena:
- 可将线程绑定到专属arena,arena的大小即为该线程“占用”的内存。
- 若程序未按线程池划分模块,可在特定模块中使用
mallocx。例如模块A调用模块B时,将模块B的所有malloc替换为指定专属arena的mallocx,该arena的大小即为模块B的内存占用。
C++中的实现困难
- C++标准库依赖Allocator指定内存分配方式,无法通过宏直接将
malloc替换为mallocx,必须自定义Allocator——哪怕是简单的std::string,都要替换成std::basic_string<char, std::char_traits<char>, Myallocator<char>> s。 - Allocator存在类型差异:
vector<T, ThisAllocator<T>>与vector<T, ThatAllocator<B>>是不同类型;如果存在vector<vector<T>>这类复杂嵌套类型,还需要使用scoped_allocator_adaptor。
因此,追踪某类或某模块所有实例的内存分配难度极大。
我想知道是否存在性能损耗较低的简便方案?我认为若Mgr1的所有字段及子字段都使用某种Allocator,即可在其allocate方法中记录内存使用情况,但如何仅强制Mgr1及其所有直接、间接子字段使用自定义Allocator?
内容的提问来源于stack exchange,提问作者calvin
相关产品推荐
相关产品推荐

