1

我有一个程序,当在初始化时查询时,它会立即使用 > 2 GB 的 RAM。基本上代码是这样的:

#include <blah>

int main() {
    cout << get_mem_usage() << endl;
    //Lots of things happen, but no significant memory usage
    return 0;
}

输出:[2013-02-15 18:38:05.865283] 2147.71 Mb

但是,我正在链接到许多不同的共享对象文件:我检查了 ldd,我正在链接到 58 个库,.so 组合大小为 66 MB。

我很确定 get_mem_usage 程序返回了正确的值:这些值与 top 和 massif 输出一致。

我还应该提到,我正在链接高能物理分析的 ROOT 框架。

我使用的是 Linux x86_64,get_mem_usage() 函数是自产的。

如果可能的话,我想减少程序的内存使用量。

4

4 回答 4

5

我的第一个猜测:您正在链接的某些库中的静态初始化。

在 /proc/<pid>/的第一行插入一个长暂停,main()以查看内存分配的位置。例如:

  • /proc/12345/task/12345/maps
  • /proc/12345/task/12345/smaps
于 2013-02-14T18:48:03.317 回答
4

我找不到任何关于get_mem_usage().

它报告了什么样的内存使用情况?

确定虚拟内存系统中的内存使用情况是一个相当大的挑战。

实际使用的内存量是您的resident set size. 这基本上是您正在使用的任何物理内存。尽管使用共享库(例如 libc),但内存消耗也(部分)与其他应用程序共享。

然后是一个虚拟集大小 - 任何映射的虚拟内存、任何匿名映射、任何其他映射文件的总和。其中大部分不会真正得到物理内存的支持(即不是常驻内存),并且可能会在其他程序中共享。

pmap -x <pid>会给你一张整洁的桌子,包括常驻/肮脏的部分。

总的来说,值得研究是什么“使用”了所有这些内存,但这可能根本不是什么大问题。如果您在 32 位系统上运行,那么以后可能会变得有点紧张(因为您的虚拟地址空间是有限的)。

于 2013-02-15T04:21:38.727 回答
2

另一种可能性:如果您的应用程序之间有共享内存,那么该共享内存将计入访问共享内存段的每个应用程序,即使它只分配一次。因此,如果在某处分配了 2gb 的共享内存段,并且 20 个不同的应用程序使用该共享内存,那么所有 20 个应用程序似乎都在使用 2+gb 的内存,看起来好像已分配了 40+gb 的内存.

于 2013-02-14T19:08:44.010 回答
2

在这种情况下,它原来是一个分配 1.9 G 内存的库(我没有直接使用)。我通过查看 /proc/12345/smaps 找到了它

2aaab2197000-2aab2ba86000 rw-p 2aaab2197000 00:00 0 
Size:           1991612 kB

在 /proc/12345/maps 中查找地址我发现

2aaab2174000-2aaab2197000 rw-p 0016c000 4f9:2c566 59607963               /mnt/lustre/epp_scratch/atlas/sm442/Irvex/lhapdf-5.8.8/lib/.libs/libLHAPDF.so.0.0.0

这是一个进行大量静态初始化的 fortran 库。

于 2013-02-14T22:27:22.033 回答