2011-10-19 36 views
3

我知道在内存分析中已经有一些线程使用了massif和其他工具,但我不知道是否有任何工具或常见技术用于生产环境中的运行时内存分析。C++中的运行时内存分析

可以想象一个实现,其中每个类都提供一个memSize()函数,并通过在其所有成员上调用memSize()并添加它们自己的大小(或大小估计)来扩展容器。然后,在任何时候,您都可以查询应用程序,并使用大部分内存以及随着时间的推移而改变的主要数据结构。

不幸的是,上述策略可能会非常棘手 - 您必须处理诸如锁定,内存对齐等问题,有时您不会知道第三方数据结构有多大,并且您必须猜测。总的来说,它似乎还有相当多的工作要添加到所有类...

因此,来实际的问题 - 什么是监视内存使用情况和导致内存在运行时增长的好方法处理?

回答

2

如果你愿意:

  • 实现自己的内存管理;或
  • 创建周围的内存分配/ dealloc的函数的包装使用的是

,那么你可以跟踪什么分配,大小和业主。在我们的嵌入式设备中,我们扩展了内存管理器,为分配的每个内存块记录附加信息。在我们的例子中,我们跟踪以下内容:

  • 时间戳
  • 线程ID
  • 块大小
  • 堆在分配

的时间历程,我们有一个机制,通过它我们可以要求系统遍历阻止列表(链接列表)并将上面的每个块的信息转储到.csv文件。这可以在系统内存不足或内存崩溃时自动触发,也可以随时手动触发。生成.csv文件后,我们有一个Perl脚本可以对其进行摘要并根据原始线程,堆栈跟踪等对请求进行分组。这非常方便,例如,它可以让我们看到有多少内存和多少分配来自代码中的特定位置。

我们发现在查找泄漏方面非常有用的技术是在某个进程正在运行时的不同时间生成两个或多个.csv报告。比较消化的记忆日志可以让我们轻松地发现泄露的记忆。

我们发现添加这些信息的开销很大,因此我们在生产系统中启用了此功能,以便当某个单元在该字段中失败时,我们可以收集.csv文件并执行post-死亡分析。

+0

这看起来像很多额外的信息(特别是堆栈跟踪),打开它的性能影响是什么? –

+0

这基本上是massif类型方法的运行时版本,对吧?问题在于 - 比方说,如果你知道你有100M的字符串,并且这是你的大部分内存使用情况 - 这是否对你有帮助?假设你有大量的类和集合,其中包含字符串 - 你怎么知道哪一个导致高使用率......这就是为什么我在考虑更多遍历显式结构类型的方法 – naumcho

+0

@Matthieu:在我们的嵌入式系统中获取堆栈跟踪并不昂贵。我们没有得到符号,只是帧的地址,并且使它成为固定成本,我们只提取前6帧左右。然后作为后处理,我们使用符号图将地址转换为符号。 – Miguel