簡體   English   中英

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

[英]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> /以查看分配內存的位置。 例如:

  • / proc / 12345 / task / 12345 / maps
  • / proc / 12345 / task / 12345 / smaps

我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM