2016-01-11 27 views
1

我正在尝试减少C++应用程序的内存占用量。随着时间的推移,由于开发人员为了各种目的在存储器中创建新的重复数据表示,此应用程序对内存的使用量不断增长。如何在内存分析期间跟踪C++应用程序中内存访问的频率和数量?

我想确定访问这些重复表示的数据的频率,以便我可以决定是否使它们短暂存取以及创建访问权限以减少峰值堆大小。

所以我的问题是 - 什么是最好的方法来跟踪,不仅大小和内存分配,的体积也是频率和访问量堆内存?我知道所有基本的内存配置文件处理分配信息 - 与内存访问相关的是我感兴趣的内容。

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

+0

IIRC valgrind支持这一点。 –

+0

写下它作为一个答案与一些指令,以便如何获得这些信息,我会愉快地upvote和/或接受。 –

+0

对不起,但我更加认同:_“要求我们推荐或找到书籍,工具,软件库,教程或其他非本地资源的问题与Stack Overflow无关,因为它们倾向于吸引自以为是的答案并且垃圾邮件,而是描述问题以及到目前为止解决问题所做的工作。“_ –

回答

3

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

我无法以特定的方式回答它,但我会假设您可以访问源代码,可以使用gcc编译它,并且您的plateform支持Valgrind。如果我的假设是错误的,请更新您的问题,因为以下是关于Valgrind地块的粗略教程,而这不是要求提供的内容。

  1. Install Valgrind
  2. 使用-g编译程序和-O0
  3. 一旦执行完毕运行与
  4. 程序,该地块工具将创建了一个名为massif.out文件。[ PID]
  5. 运行命令ms_print massif.out.[PID]

这将产生表示的曲线图内存消耗以及程序中所有分配点的详细信息,包括峰值内存分配点。

如果你想跟踪访问内存,你可以使用DHAT工具(见this link的详细说明):

  1. 与地块,使用-g和-O0
  2. 编译程序与valgrind --tool=exp-dhat your.exe
+0

这个答案中缺少的一点是跟踪_accesses_到内存。我试图确定数据的重复表示的频率是多少,以便我可以决定是否使它们短暂存在,并创建访问权限以减少峰值堆大小。 –

+0

我从来没有使用它,但Valgrind的DHAT工具可以做到这一点。 [链接](http://valgrind.org/docs/manual/dh-manual.html) –

+0

如果你想添加DHAT的说明这个答案(或者甚至只是提及它),我会接受它。 DHAT看起来可能会给我以后的样子。 –

1

两个点运行程序:

1)如果你正在寻找内存泄漏(这可能会很慢)的这样做的方法是使用其中一种方法来查看在程序结束时哪些内存块还没有被释放。这可以让你找出他们来自哪里,以及他们为什么没有被释放。2)如果这是一个内存分配过度(和释放)的问题,我发现它伴随着很大一部分时间花费在做这些。所以这不仅仅是一个内存问题,它是一个性能问题,而且很容易找到。 Here's an example.

请注意,这与您提出的问题有点不同。 你问过如何跟踪内存分配,以便找到可以消除的内存分配。 这项技术的作用是直接找到它们,而不需要通过跟踪部分。 工作方式是内存分配和释放在计算上花费很大,所以它往往占了很大一部分周期,所以随机时间的样本很容易暴露它。

相关问题