2012-03-17 59 views
11

如何linux平臺下找到一個C++程序的堆內存大小的堆大小?我需要堆內存空間的新的malloc或在使用前,也that.can人後幫助嗎?如何讓程序

#include <malloc.h> 
#include <iostream> 
int main() 
{ 

    //here need heap memory space 
    unsigned char* I2C_Read_Data= new unsigned char[250]; 
    //get heap memory space After the usage of new 
    return 0; 
} 
+2

new和malloc不使用相同的區域... – UmNyobe 2012-03-17 09:37:35

+2

@UmNyobe:這很奇怪,因爲通常'new'調用':: operator new()',而這通常通過'malloc()'來實現。 ... – 2012-03-17 09:45:35

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap – UmNyobe 2012-03-17 09:48:05

回答

2

可以使用getrlimit函數調用並傳遞RLIMIT_DATA的資源。這應該給你的程序數據段的大小。

+0

謝謝你的回覆,你能給我一個示例代碼嗎? – Anu 2012-03-17 10:00:42

+0

簡單的搜索會產生像這樣的鏈接 - http://www.linuxquestions.org/questions/programming-9/getrlimit-is-setting-soft-and-hard-limits-to-1-why-160165/ – Gangadhar 2012-03-17 10:07:02

+0

嗨, 在這裏它顯示內存空間,但空間分配後沒有改變。 – Anu 2012-03-19 04:03:45

5

使用的valgrind的堆探查:Massif

+1

+1其他人已經爲你做了... – UmNyobe 2012-03-17 09:47:01

+0

我正在使用'arm-linux'平臺....如何使用valgrind的這個平臺?任何想法? – Anu 2012-03-19 06:56:17

4

您也可以通過重載newdelete運營商增加堆跟蹤到自己的程序。在a game engine我正在處理,我有所有內存分配通過特殊函數,它將每個分配附加到特定的堆跟蹤器對象。這樣,在任何特定時刻,我都可以調出報告,查看實體,演員,Lua腳本等佔用了多少內存。

它不如使用外部Profiler(特別是在外部庫處理他們自己的內存管理),但是確切地看到你要負責的內存是非常好的。

sample of my memory tables

0

除了外部的檢查,還可以檢測你自己的malloc實現,讓你檢查這些統計信息。 jemalloctcmalloc是一些實現,除了對多線程代碼執行更好的代碼(典型的libc實現)之外,它還添加了某種類型的實用程序函數。

爲了深入挖掘,你應該學習一些如何堆分配工作。最終,OS是一個分配的內存來處理,因爲他們提出要求,但是要求的OS(系統調用)表現一般比普通電話較慢,所以malloc的實施將要求大塊的OS(4KB或8KB塊是常見的),並細分他們爲他們服務的呼叫者。

您需要確定您是否對過程所消耗的總內存(包括代碼本身),在特定過程調用中從操作系統請求的進程的內存感興趣,實際使用的內存由malloc實現(它增加了它自己的記帳開銷,無論如何很小),或者請求你的。

此外,破碎可以是用於後兩者一痛,並且可以稍微模糊之間真正使用和分配給該差異。

2

在Linux上,你可以閱讀/proc/[pid]/statm獲得內存使用信息。

提供有關內存使用情況,以頁面爲單位的信息。該 列:

   size  total program size 
         (same as VmSize in /proc/[pid]/status) 
       resident resident set size 
         (same as VmRSS in /proc/[pid]/status) 
       share  shared pages (from shared mappings) 
       text  text (code) 
       lib  library (unused in Linux 2.6) 
       data  data + stack 
       dt   dirty pages (unused in Linux 2.6) 

有關詳細信息,請參閱man page。亞當Zalcman

回答這個question介紹堆分配的一些有趣的細節

+0

單位是什麼?字節?或頁面? – weima 2016-09-27 16:10:45

+0

單位是頁面。您可以使用getconf PAGE_SIZE來知道頁面以字節爲單位的大小。 – 2017-05-05 15:06:57

0

你可以試試「mallinfo」和「malloc_info」。他們可能會工作。當您分配2GB以上時,mallinfo存在問題。malloc_info是o/s特定的,特別非常奇怪。我同意 - 通常很高興在沒有第三方工具的情況下執行此操作。