【问题标题】:Why is the resident set size (RSS) of my program larger than the executable?为什么我的程序的驻留集大小 (RSS) 大于可执行文件?
【发布时间】:2015-05-21 01:07:36
【问题描述】:

运行一个在while循环中简单等待的简单程序,我很想知道该进程的内存统计信息。我运行的程序如下

#include<stdio.h>

int main()
{
    while(1)
    {
    }
return 0;
}

当编译上述程序时,会生成一个 7950 字节(大约 2 页)的可执行文件。但是/proc/pid/statm 将 rss 大小设为 72 页?谁能在这里提供一些见解?

问候, 梅拉杰

【问题讨论】:

  • 谢谢阿伦!我无法编辑它。

标签: c unix memory-management


【解决方案1】:

在程序运行时,除了可执行文件中的代码和数据段之外,还需要驻留在内存中的内容更多。例如,它可能还具有来自堆栈、堆、共享库和文件映射的常驻内存页面。

如果您想了解常驻页面的使用情况,您可以查看/proc/&lt;pid&gt;/smaps -- 特别是 Rss: 字段。

/proc/&lt;pid&gt;/maps(没有's')会给你一个更易读的过程映射概述。请注意,例如堆栈(或多线程情况下的堆栈)和堆也算作映射。

这是cat /proc/self/maps 的一些示例输出(它将打印cat 进程本身的映射)。我在右侧添加了箭头(可能需要滚动)来解释一些不同的映射是什么。知道后,您可以查看cat /proc/&lt;pid&gt;/smaps 以查看每个映射的驻留大小。

00400000-0040c000 r-xp 00000000 08:01 3409248 /bin/cat

【讨论】:

  • 谢谢 Ulfalizer。所以你的意思是 task_struct 跟踪所有进程相关的统计信息,总结每个进程的所有映射以获得 rss 大小??
  • @MerajHussain:我不确定/proc/&lt;pid&gt;/&lt;statm&gt; 的确切信息是从哪里获得的,但是是的,它可能只是显示了所有映射的总 rss。
  • ...并且任何时候您看到“进程 x 的 rss”,那么这可能意味着(或至少近似)所有映射的总 rss。 (可能有一些我不知道的细微之处。)检查每个映射的 rss 将使您了解至少在哪里使用了内存。
猜你喜欢
  • 2011-03-03
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2015-09-19
  • 2012-09-25
相关资源
最近更新 更多