我有一个程序,在初始化时查询时,立即使用> 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()函数是自行开发的。
如果可能的话,我想减少程序的内存使用量。
答案 0 :(得分:5)
我的第一个猜测:你要链接的一些库中的静态启动。
插入一个长暂停作为main()
的第一行,并查看/ proc /&lt; pid&gt; /以查看内存的分配位置。例如:
答案 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库。