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

标签 c++ profiling memory-profiling

我正在尝试减少 C++ 应用程序的内存占用。随着时间的推移,由于开发人员出于各种目的在内存中创建新的重复数据表示,此应用程序对内存的使用有所增加。

我想确定这些重复的数据表示被访问的频率,以便我可以决定是否让它们短暂存在并在访问时创建,以减少峰值堆大小。

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

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

最佳答案

就像评论一样,您的问题非常广泛。

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

  1. Install Valgrind
  2. 用-g 和-O0 编译你的程序
  3. 使用 valgrind --tool=massif your.exe 运行您的程序
  4. 执行完成后,massif 工具将创建一个名为 massif.out.[PID] 的文件
  5. 运行命令ms_print massif.out.[PID]

这将生成一个图表,显示内存消耗和有关程序中所有分配点的详细信息,包括峰值内存分配点。

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

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

关于c++ - 如何在内存分析期间跟踪 C++ 应用程序中内存访问的频率和容量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34731842/

相关文章:

python-3.x - mprof run <executable> 让我得到 "Command not found"

c++ - 头文件和 odr 中的 constexpr 全局常量

c++ - "return new node"内存泄漏,我找不到修复它的方法

c++ - 将函数参数 `const char*` 转换为 `std::string_view` 是否安全?

java - 如何分析生成的异常数量(按异常类或代码行分类)

java - 性能调整、检测和页面错误

python - Python:无法复制内存使用情况的测试

c++ - 如何从 cvPoint 中分别获取 x 和 y 坐标到 int?

node.js - 使用 --inspect 分析 NodeJS 时, "(program)"是什么意思

Android studio 的分配跟踪器图形 View