手夯一个STL allocator和对象内存分析组件
💡
原文中文,约21000字,阅读约需50分钟。
📝
内容提要
该文章介绍了作者在排查和分析压测环境下的某些业务模块大量索引结构的内存问题时,针对智能指针和STL容器实现了allocator来帮助动态的手动插桩来分析问题。文章详细介绍了allocator的基础接口、rebind_alloc的使用、检测类型和设置Alias的两种方式、检测函数存在的两种实现方法以及按对象类型的内存统计模块的实现。最后展示了Allocator的基础统计的部分输出。
🎯
关键要点
- 文章介绍了在压测环境下排查内存问题的方法。
- 使用自定义的allocator来动态插桩分析智能指针和STL容器的内存问题。
- 详细介绍了allocator的基础接口,包括内存分配、释放、构造和析构等功能。
- C++20后,allocator的构造和析构函数接口发生了变化,需要使用allocator_traits特化。
- 介绍了allocator的rebind功能,允许在不同类型之间重新绑定allocator。
- 讨论了检测类型和设置Alias的两种方式,使用元编程技巧进行编译期检测。
- 提供了两种检测函数存在的实现方法,利用模板优先匹配规则。
- 提供了通用标准化的allocator_traits实现辅助类,简化定制Allocator的过程。
- 实现了按对象类型的内存统计模块,记录内存分配和构造析构的统计信息。
- 指出了boost某些容器实现的问题,可能导致统计遗漏。
- 介绍了C++符号的demangle技巧,优化了符号的可读性。
- 展示了Allocator的基础统计输出,包括构造计数、析构计数和内存分配情况。
➡️