[英]C++ Program immediately using 2 GB of RAM: how to find culprit?
我有一個程序,在初始化時被查詢,立即使用> 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()函數是本地開發的。
如果可能的話,我想減少程序的內存使用量。
我的第一個猜測:您正在鏈接的某些庫中的靜態初始化。
在main()
第一行插入一個較長的停頓,然后瀏覽/ proc / <pid> /以查看分配內存的位置。 例如:
我在get_mem_usage()
上找不到任何文檔。
它報告哪種內存使用情況?
確定虛擬內存系統中的內存使用量是一個很大的挑戰。
實際使用的內存量是您的resident set size
。 這基本上就是您正在使用的任何物理內存。 盡管使用共享庫(例如libc),但該內存消耗也(部分)與其他應用程序共享。
然后有一個虛擬集大小-映射的任何虛擬內存,任何匿名的映射,任何其他映射的文件的總和。 其中大部分將不會真正由物理內存(即不駐留)支持,並可能在其他程序之間共享。
pmap -x <pid>
將給您一個整潔的表,包括居民/骯臟的部分。
總體而言,值得研究“使用”所有內存的內容,但這可能根本不是一個問題。 如果您在32位系統上運行,則稍后可能會變得有些緊張(因為您的虛擬地址空間有限)。
另一種可能性:如果您的應用程序之間有共享內存,則該共享內存將計入訪問共享內存段的每個應用程序,即使該共享內存僅分配一次。 因此,如果在某處分配了2gb共享內存段,並且有20個不同的應用程序使用該共享內存,則所有20個應用程序似乎都在使用2 + gb的內存,從而看起來好像已經分配了40 + gb的內存。
在這種情況下,原來是分配了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庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.