2011-10-22 60 views
0

我有,我想很快看到它是多少堆的使用使我實現了這兩個小程序爲什麼sbrk()告訴我我使用了多少堆?

static void * start_memory = 0; 
unsigned long System::memoryUsage(){ 
    void * here = sbrk(0); 
    return (char*) here - (char*) start_memory; 
} 

void System::startMemoryUsage(){ 
    start_memory = sbrk(0); 
} 

我打電話startMemoryUsage()遊戲引擎很早就在我的main()。當我在運行時使用它時,我通常會看到相對較低的值,例如300kb,但頂部表示RSS大約在30mb左右。我怎麼沒有從sbrk()中獲得準確的測量結果?

我猜它與線程有關。遊戲引擎產生5個線程(+主要是6個),它處理輸入和音樂等事情。難道主線程真的在使用300kb,但其他線程總共爲30MB?

回答

2

sbrk(0)只告訴你數據段的末尾在哪裏。 malloc()不僅通過擴展數據段來獲取內存,還可以通過調用mmap()來獲得更大的內存分配。另外,由於您正在使用多個線程,因此其他線程的其他線程也可能會變形。

+0

有沒有一種方法可以通過編程來計算mmap佔用的所有內存? – jonr

+0

@jonr:讀取和解析/ proc/self/smaps – SoapBox

+0

大多數malloc都有'malloc.h'中定義的'mallinfo'函數,它允許您查詢關於內存使用情況的統計信息。只有在測試之後(作爲你的配置/構建腳本的一部分),你才應該小心使用它,它存在...... –

相關問題