私は、空きメモリをLinux上でGNU C ++に残っているどのくらいの方法を見つけるのですか

StackOverflow https://stackoverflow.com/questions/391107

  •  23-08-2019
  •  | 
  •  

質問

私はC ++プログラム(gccでコンパイルされ、RedHatのLinux上で実行されている)を書いています。プログラムがスタック上に残し、どのくらいのヒープに残されているどのくらいのスペース、実行時に知っておく必要があります。私は代わりに、私はすでに代わりにヒープから割り当てられたメモリの量を使用することができ、(ヒープ程度)この質問に対する明確な答えはないかもしれません実現しています。私は、このデータを与えるライブラリ/システム関数呼び出しがありますか?

私は唯一のデバッグ目的のためにこれを必要とし、唯一の概算が必要であることを追加したいと思いますので、間に合わせと-ソリューションは完全に許容されています。しかし、私はUnixのCMDラインユーティリティを砲撃し、その出力を解析することは受け入れられない、非常に頻繁にメモリ使用量を照会する必要があります。

正しい解決策はありません

他のヒント

あなたはおそらく、あなた自身の新しいを作成し、実際の新機能をカプセル化を削除し、オペレータを削除すると同時に、メモリ使用量のノートを取ることができます。

スタックの場合、あなたはスタックポインタが現時点である場合について大まかなアイデアを得るためにあなたの現在の関数で定義された最初のローカル変数のアドレスを見てみましょうCでのトリックがあります。私はそれがCで動作する必要がありますね++が、それを試していません。

Linux上で使用すると、/ procの/ pid /ステータスを読み取ることができます。

32ビットシステムで、スタックが下向きに成長し、ヒープが上向きに成長し、2は中間にどこかで会うかもしれないことに注意してください。スペースは、それゆえ、同時にまたはヒープにではなく、両方をスタックに割り当てられている可能性があります。 (あなたがそれらを使用する場合)のメモリマップを複雑にその共有メモリ・セグメントに注意してください。だから、動的(共有)ライブラリをロードすることができます。

+------------+
|    stack   | high addresses
|      |     |
|      v     |
+------------+
|            |
|   unused   |
|            |
+------------+
|            |
|      ^     |
|      |     |
|    heap    |
|            |
+------------+
|            |
|     bss    |
|            |
+------------+
|            |
|    data    |
|            |
+------------+
|            |
|    text    |
|            | low addresses
+------------+

64ビット・システムでは、衝突が発生する前に、あなたが現実と仮想メモリを実行する十分なアドレス空間があります。

彼らはオーバーコミット -

また、Linux(少なくともいくつかのバージョンでは)より多くのメモリは、彼らが実際にサポートできるよりも割り当てることができると言って喜んでであることに注意してください。それは非常に良いではありません。これは、トライアルメモリ割り当てのような実用的な実験があなたに誤った安心感を与える可能性があることを意味ます。

ほとんどの場合、あなたが求めてオフ最高です、むしろ「残っているどのように多くのMB(GB?)を空間の」より、「残された空間のx MB(GB?)」です。他の人が使用しているどのくらいのメモリのための情報源として/procファイルシステムを指摘しました。私はそれを確実につかむために提供されていますどのくらいのメモリについて説明しますかどうかはわからない。

このはラズベリーPI上の空きメモリの量を返すCの関数です。 これは、/ procの/ meminfoのを読むことによって動作します。私はそれが他のシステムで動作するかどうかはわからない。

#include <stdio.h>
#include <string.h>
// Return the amount of free memory in kbytes.
// Returns -1 if something went wrong.
int getfreememory()
{
  int returnValue;
  const int BUFFER_SIZE = 1000;
  char buffer[BUFFER_SIZE];
  FILE *fInput;
  int loop;
  int len;
  char ch;
  returnValue = -1;
  fInput = fopen("/proc/meminfo","r");
  if (fInput != NULL)
  {
    while (!feof(fInput))
    {
      fgets(buffer,BUFFER_SIZE-1,fInput);
      if (feof(fInput))
      {
        break;
      }
      buffer[BUFFER_SIZE-1] = 0;
      // Look for serial number
      if (strncmp(buffer,"MemFree:",8)==0)
      {
        // Extract mem free from the line.
        for(loop=0;loop<BUFFER_SIZE;loop++)
        {
          ch = buffer[loop];
          if (ch == ':')
          {
             returnValue = 0;
             continue;
          }
          if (ch == 0)
          {
              break;
          }
          if (returnValue >=0)
          {
             if (ch >='A')
             {
                break;
             }
             if ((ch >='0') && (ch <='9'))
             {
                returnValue = returnValue * 10 + (ch-'0');
             }
          }
        }
        break;
      }
    } 
    fclose(fInput);
  }
  return returnValue;
}

あなたはは、現在のプロセスIDで/ procの名前空間のファイルは/ proc / / smapsとは/ proc / /マップで確認することができます。

このブログ投稿は、アウトをチェックします。

のValgrindの山塊のツールでは、スタックとヒーププロファイリングの両方をサポートしています。あなたは、それはそれをしない方法を確認するために、そのソースコードを確認したいことがあります。

ヒープの部分については、多分あなたは、リソースの制限に達しています。 こののを確認します。

あなたは、スタックプロファイリングのためのValgrindを使用することができるが、どのようなあなたはそれをどうするつもりですか?スタックは、ヒープのようではありません。あなたはデバッグ目的のためにこれをやってみたい、と言います。あなたのプログラムが正常に動作した場合、その後、何のスタック問題は(少なくともその大きさに関係する)はありません。

あなたが作成したスレッドのスタックサイズを設定し、(最適化されたアウトしてはいけません)ローカル変数のアドレスを見て、スタックポインタの値を検査することができます。ただ、初期サイズ、初期スタックポインタ値と現在のスタックポインタの値を使用して、いくつかの計算を行う、あなたはいくつかの素晴らしい数字を取得します。ただ、最初の積層方向を見つけることを忘れないでください。これはプラットフォームから変更されることがあります。

私はあなたのヒープの使用状況のため、このあまり気にならば、あなたのプログラムは、おそらくメモリリークと思います。この場合、Valgrindのは正しい方向にあなたを指すことができます。 Valgrindの

RLIMIT_STACKののparamaterではgetrlimitは、合計でどのくらいのスタックスペースがあることを教えてくれます。 RLIMIT_ASのパラメータを使用すると、そこにあるどのくらいの仮想メモリを見つけることができます。

詳細については、 http://linux.die.net/man/2/を見てgetrlimitする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top