2013-02-14 82 views
1

我有一個程序,當初始化查詢時,立即使用> 2 GB的RAM。基本碼是這樣的:立即使用2 GB RAM的C++程序:如何找到罪魁禍首?

#include <blah> 

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

輸出: [2013年2月15日18:38:05.865283] 2147.71 MB

我,然而,鏈接到很多不同的共享對象的文件:我檢查了ldd,並且鏈接到58個庫,並且大小爲66 MB。

我很確定get_mem_usage程序返回了正確的值:這些與top和massif輸出一致。

我還應該提到,我正在連接高能物理分析的ROOT框架。

我使用的是Linux x86_64,並且get_mem_usage()函數是本地生成的。

我想盡可能減少程序的內存使用量。

+11

什麼是'get_mem_usage'? – NPE 2013-02-14 18:45:31

+0

問題是什麼?你想知道哪些圖書館消費了多少? – 2013-02-14 18:47:05

+1

你看過你的.map文件來查看靜態RAM在哪裏和多少intiialized?注意,你也許能夠跟蹤來自庫的動態分配。 – 2013-02-14 18:49:17

回答

5

我的第一個猜測:你正在鏈接的一些庫中的靜態啓動。

插入長暫停作爲main()的第一行並查看/ proc/<pid> /以查看分配內存的位置。例如:

  • 的/ proc/12345 /任務/ 12345 /圖
  • 的/ proc/12345 /任務/ 12345/smaps
+0

謝謝!追蹤這些信息的好方法是什麼? – invisiblerhino 2013-02-14 18:54:20

+0

關於/ proc/pid/maps的一些信息:http://stackoverflow.com/questions/1401359/understanding-linux-proc-id-maps – 2013-02-14 19:02:08

2

另一種可能性:如果您的應用程序之間共享內存,那麼共享內存會針對訪問共享內存段的每個應用程序計數,即使它只分配一次。因此,如果某個地方分配了2GB的共享內存段,並且20個不同的應用程序使用該共享內存,則所有20個應用程序看起來好像在使用2 + gb的內存,看起來好像分配了40 + gb的內存。

+0

這個。我認爲這是 – 2013-02-14 20:07:30

+0

作爲靜態初始化當然是 – 2013-02-14 20:07:55

2

在這種情況下,它證明是一個單獨的庫(我沒有直接使用),它分配了1.9 G內存。我發現它由翻翻的/ proc/12345/smaps

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

仰望在/ proc/12345 /圖我發現

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庫靜態初始化量。

+0

的乘數如果這是正確的答案,請選擇它。選擇自己的答案時不會得到任何答案,但會從無法回答的問題列表中刪除問題。 – phonetagger 2013-08-14 18:20:18

4

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

它報告什麼樣的內存使用情況?

確定虛擬內存系統中的內存使用率是一項相當大的挑戰。

實際使用的內存量是您的resident set size。這基本上是你正在使用的任何物理內存。雖然使用共享庫(例如libc),但內存消耗也與其他應用程序共享(部分)。

然後有一個虛擬集大小 - 映射的任何虛擬內存,任何匿名映射,任何其他映射文件的總數。其中大部分內容不會真正被物理內存支持(即沒有駐留),並可能在其他程序中共享。

pmap -x <pid>會給你一個整潔的表,包括居民/髒部分。總之,值得研究什麼「使用」了所有的記憶,但它可能並不是什麼大問題。如果你使用的是32位系統,那麼以後可能會有些緊張(因爲你的虛擬地址空間有限)。

+0

對不起 - get_mem_usage()是本地的。它只是查看/ proc//statm的輸出。在我的情況下,它是一個配置不好的fortran庫,它立即初始化一個巨大的數組,並且大量的內存不能被其他進程共享(據我所知)。 – invisiblerhino 2013-02-15 10:58:12

相關問題