首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'time -f‘%M’和'valgrind =massif‘之间有什么区别?

'time -f‘%M’和'valgrind =massif‘之间有什么区别?
EN

Stack Overflow用户
提问于 2019-09-17 12:08:25
回答 1查看 740关注 0票数 3

我希望看到command的峰值内存使用情况。我有一个参数化的算法,我想知道程序何时会崩溃,因为我的机器上内存不足(12 to )。

我试过:

代码语言:javascript
复制
/usr/bin/time -f "%M" command
valgrind --tool=massif command

第一个给了我1414168 (1.4GB;感谢ks1322指出它是以KB!)勇敢的给了我

代码语言:javascript
复制
$ ms_print massif.out
--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 75 26,935,731,596       22,420,728       21,956,875       463,853            0

我有点搞不懂我应该取哪个数字,但是让我们假设“总计”(22‘s)。

massif-visualizer告诉我

现在,对于同一个命令,我有3个不同的数字:

  • valgrind --tool=massif command + ms_print:22MB
  • valgrind --tool=massif command + massif-visualizer:206‘m(这是我在htop中看到的,我猜这就是我感兴趣的in)
  • time -f "%M" command:1.4GB

我应该看哪个号码?为什么数字是不同的呢?

EN

回答 1

Stack Overflow用户

发布于 2019-09-25 20:31:06

/usr/bin/time -f "%M"测量最大的RSS (驻留集大小),即内存中的进程使用的内存,而不是交换出来的内存。此内存包括堆、堆栈、数据段等。

这测量子进程(包括孙辈)的最大RSS值(而不是子代RSS之和的最大值)。

valgrind --tool=massif,如文档所述:

只测量堆内存,即分配给malloc、calloc、realloc、memalign、new、new[]和其他几个类似函数的内存。这意味着它不直接测量使用较低级别的系统调用(如mmap、mremap和brk )分配的内存。

这只测量孩子(而不是孙子)的记忆。这并不测量堆栈,也不测量文本和数据段。

(像--pages-as-heap=yes--stacks=yes这样的选项可以进行更多的测量)

所以在你的例子中,区别是:

  • time考虑到孙辈,而valgrind不度量交换的内存,而valgrind does
  • time测量堆栈和数据段,valgrind不测量

你现在应该:

检查是否有一些子级负责内存consumption

  • try分析,使用valgrind --tool=massif --stacks=yes检查堆栈

  • ,尝试与valgrind --tool=massif --pages-as-heap=yes一起分析以检查内存使用情况

的其余部分

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57973895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档