2012-03-17 24 views
11

LinuxプラットフォームでC++プログラムのヒープメモリサイズを見つけるにはどうすればよいですか?newまたはmallocを使用する前にヒープメモリスペースが必要です。プログラムのヒープサイズを取得する方法

#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

+2

@UmNyobe:通常は 'new'は' :: operator new() 'を呼び出します。これは通常malloc()で実装されています。 ... –

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap – UmNyobe

答えて

2

あなたはgetrlimit関数呼び出しを使用して、リソースのためのRLIMIT_DATAを渡すことができます。それはあなたのプログラムのデータセグメントのサイズを与えるはずです。

+0

返信いただきありがとうございます。サンプルコードを教えていただけますか? – Anu

+0

簡単な検索でこのようなリンクが得られました - http://www.linuxquestions.org/questions/programming-9/getrlimit-is-setting-soft-and-hard-limits-to-1-why-160165/ – Gangadhar

+0

こんにちは、 これはメモリスペースを示しますが、スペースが割り当てられた後は変更されません。 – Anu

5

使用valgrindののヒーププロファイラ:Massif

+1

他の人がすでにあなたのために+1しました... – UmNyobe

+0

私は 'arm-linux'プラットフォームを使用しています....このプラットフォームではどのようにvalgrindを使用できますか? – Anu

4

またnewdelete演算子をオーバーロードすることにより、独自のプログラムに、ヒープの追跡を追加することができます。私が取り組んでいるa game engineでは、私はすべてのメモリ割り振りを特別な関数を経由させています。これはそれぞれの割り当てを特定のヒープトラッカーオブジェクトにアタッチします。このようにして、任意の時点でレポートを作成し、エンティティ、アクター、Luaスクリプトなどがどれくらいのメモリを占有しているかを確認できます。外部プロファイラを使用する場合ほど徹底していません(特に外部ライブラリは独自のメモリ管理を処理しますが)あなたが担当していたメモリを正確に見ることは非常にうれしいです。

sample of my memory tables

0

別に外部の検査から、あなたはまた、機器のmallocの実装では、これらの統計を調べてみましょうすることができます。 jemalloctcmallocは、典型的なlibc実装のマルチスレッドコードの方が性能が優れている上に、そのようなユーティリティ関数をいくつか追加する実装です。

もっと深く掘り下げるには、ヒープ割り当ての仕組みをもう少し学ぶ必要があります。最終的には、OSは要求に応じてプロセスにメモリを割り当てるものですが、OS(システムコール)への要求は通常の呼び出しよりも遅いため、一般にmallocの実装では、大きなチャンクをOSに要求します(4KBまたは8KBブロック共通しています)、それらをサブディビジョンして発信者に提供します。

プロセスによって消費されたメモリ(コード自体を含む)、特定のプロシージャコール内のOSから要求されたプロセスのメモリ、実際に使用されているメモリ、malloc実装(それは独自の帳簿のオーバヘッドを追加するが、小さい)またはメモリが要求された。

また、フラグメンテーションは、後者の2つの痛みであり、実際に使用されているものと割り当てられているものの違いを若干ぼかすことがあります。

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を参照してください。このquestionにアダムZalcmanによって

答えは、「mallinfo」しようとすると、「malloc_info」できるヒープ割り当て

+0

ユニットは何ですか?バイト?またはページ? – weima

+0

単位はページです。 getconf PAGE_SIZEを使ってページの大きさをバイト単位で知ることができます。 –

0

のいくつかの興味深い詳細を説明します。彼らは働くかもしれない。 2GB以上を割り当てると、mallinfoに問題があります。malloc_infoはo/sに特有であり、特に非常に奇妙です。私は同意します。サードパーティ製のツールを使用しないと、このようなことを行うのが良いことがよくあります。

関連する問題