如何在内存分析期间跟踪C ++应用程序中内存访问的频率和容量?

时间:2016-01-11 21:53:43

标签: c++ profiling memory-profiling

我正在尝试减少C ++应用程序的内存占用。随着时间的推移,这个应用程序对内存的使用已经增长,因为开发人员为了各种目的在内存中创建了新的,重复的数据表示。

我想确定访问这些双重数据表示的频率,以便我可以决定是否将它们设置为短期和创建访问权限以减少峰值堆大小。

所以我的问题是 - 不仅要跟踪内存分配的大小和数量,,还要跟踪访问到堆内存的频率和数量的最佳方法是什么?我知道所有基本内存分析器都处理分配信息 - 将其与内存访问相关联是我感兴趣的。

理想的答案是平台无关,因为此应用程序可在Windows,Linux,iOS和Android上运行。但是,我会接受适用于任何平台以及这些平台常用的任何处理器体系结构的答案,因为我们没有特定于平台的行为会影响这类事情。

2 个答案:

答案 0 :(得分:3)

就像它被评论一样,你的问题非常广泛。

我无法以特定的方式回答它,但我假设您可以访问源代码,您可以使用gcc编译它,并且您的平台支持Valgrind。如果我的假设是假的,请更新您的问题,因为以下是关于Valgrind的地块的原始教程,而这不是所要求的。

  1. Install Valgrind
  2. 使用-g和-O0
  3. 编译程序
  4. 使用valgrind --tool=massif your.exe
  5. 运行您的程序
  6. 执行完成后,massif工具将创建一个名为massif.out的文件。[PID]
  7. 运行命令ms_print massif.out.[PID]
  8. 这将生成一个图表,显示内存消耗和程序中所有分配点的详细信息,包括峰值内存分配点。

    如果您想跟踪对内存的访问,可以使用DHAT工具(有关详细说明,请参阅this link):

    1. 与massif一样,使用-g和-O0
    2. 编译程序
    3. 使用valgrind --tool=exp-dhat your.exe
    4. 运行您的程序

答案 1 :(得分:1)

两点:

1)如果您正在寻找内存泄漏(可能非常慢),那么执行此操作的方法是使用其中一种方法来查看程序完成时尚未释放的内存块。这可以让你弄清楚他们来自哪里,以及为什么他们没有被释放。

2)如果这是一个过度的内存分配(和释放)的问题,我发现它伴随着大部分的时间花费了这么多。因此,这不仅仅是内存问题,而是性能问题,而且很容易找到。 Here's an example.

请注意,这与您的要求略有不同。 您询问了如何跟踪内存分配,以便找到可以消除的分配。 这种技术的作用是直接找到它们,而无需通过跟踪部分。 有效的方式是内存分配和释放在计算上是昂贵的,因此它往往占很大一部分周期,因此随机时间样本很容易暴露它。