C ++程序立即使用2 GB的RAM:如何找到罪魁祸首?

时间:2013-02-14 18:43:24

标签: c++ memory-management ram

我有一个程序,在初始化时查询时,立即使用> 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 个答案:

答案 0 :(得分:5)

我的第一个猜测:你要链接的一些库中的静态启动。

插入一个长暂停作为main()的第一行,并查看/ proc /&lt; pid&gt; /以查看内存的分配位置。例如:

  • 的/ proc / 12345 /任务/ 12345 /映射
  • 的/ proc / 12345 /任务/ 12345 / smaps

答案 1 :(得分:4)

我在get_mem_usage()上找不到任何文档。

它报告了哪种内存使用情况?

确定虚拟内存系统中的内存使用量是一项挑战。

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

然后有一个虚拟集大小 - 映射的任何虚拟内存的总数,任何匿名映射,任何其他映射文件。其中大部分内容并非真正以物理内存(即非常驻内存)为后盾,并且可能在其他程序中共享。

pmap -x <pid>将为您提供一个整洁的表格,包括居住/脏的部分。

总的来说,值得研究“使用”所有内存的内容,但它根本不是一个问题。如果你在32位系统上运行,以后事情可能会变得有点紧张(因为你的虚拟地址空间有限)。

答案 2 :(得分:2)

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

答案 3 :(得分: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库。