c++中的多线程内存分析
Multithread Memory Profiling in C++
我正在分析应用程序中多个线程的内存使用情况。我希望能够跟踪正在运行的任何给定线程的最大分配/当前分配。为了做到这一点,我计划对malloc/free进行干预。在每次调用malloc期间,我会在一个静态映射中更新特定线程的分配记录,该映射将线程id与其特定的元数据记录关联起来。我目前在退出过程中遇到问题。我认为问题在于,当调用所有析构函数进行清理时,必须销毁保护它的静态映射和锁。但是,我插入的mallos/frees在更新分析元数据结构之前获得了锁。最终,锁被销毁,但是后续调用malloc/free会导致试图获取不再存在的锁,从而导致段错误。
我关心的另一个问题是,在我插入的malloc中生成了对malloc的内部调用,以分配映射中的条目。
在每个线程的基础上分析内存使用的方法有什么想法吗?对跟踪每个线程使用情况的数据结构有什么建议吗?上面的方法看起来合理吗?还是有其他的方法来解决这个问题?如果您将"额外的"数据存储为分配本身的一部分(之前更容易,但之后也可以这样做——只需要在某个地方确定大小),那么您根本不需要任何锁。再多一点内存。当然,您需要使用原子来更新任何项列表。
如果你看这个答案:
在自定义堆上设置内存
,想象HeapAlloc
和HeapFree
分别是malloc
和free
。然后添加代码来存储正在用于分配的线程。
因此,不使用映射,只需更新链表(使用原子来防止多次更新)。当然,这使得对每个线程进行最新的测量变得有点困难,您将不得不扫描分配列表。
当然,这只适用于直接调用malloc
和free
。
通过"注入"一个替换的malloc
/free
函数(根据另一篇文章中的原则构建,但当然不使用原始的malloc
来分配内存,也不使用free
来释放内存),可以实现相同的原则。
这是一件很复杂的事情,并使其适用于所有情况。有许多问题你会错过,只有通过尝试和错误才能发现。我应该知道,我一直负责构建一个工具来做你想做的事情。我们从1999年开始这样做,从2002年开始商业化。
如果你使用的是Windows, c++内存验证器可以给你每个线程的分析统计。http://www.softwareverify.com/cpp-memory.php。
对象选项卡和大小选项卡都有线程子选项卡,允许您查看每个线程的数据。您还可以在Analysis选项卡上运行高级查询,这将允许您以每个线程为基础查看数据。
把你的时间花在你的工作上,而不是写工具。
- 多线程程序中出现意外的内存泄漏
- 多线程环境中C++内存访问
- 多线程C :从内存中读取力,绕过缓存
- C++多线程:线程安全的内存分配
- 内存分配对多线程性能的影响
- 共享内存多线程和数据访问
- 为什么在 Linux 上使用更多线程时内存消耗会增加?(C++)
- 为多线程将结构内存分配给参数
- Linux 上的多线程C++应用程序中的内存泄漏
- 为多线程环境实现单例的内存泄漏
- 具有强内存模型的平台上的易失性和多线程
- c++11多线程内存错误
- 多线程的内存注意事项
- 并发:用于多线程环境中共享变量的C++11内存模型
- 在具有动态大小内存池的多线程C/C++中实现内存管理器
- 具有高多线程的TBB 4.2内存泄漏
- 为什么在多线程中使用内存性能会下降
- 内存的多线程编程
- 避免多线程应用程序中潜在的死锁/内存泄漏
- c++中的多线程内存分析