1

アプリケーションの仮想バイトは、プライベート バイトの 2 倍になります。

これはメモリリークを示していますか?アプリケーションの設計が悪い?

OSは32Bit

どんな考えでも大歓迎です。アプリケーションはストリーム データベースです。

4

4 に答える 4

3

アプリケーションの仮想バイトは、プライベート バイトの 2 倍になります。

アプリケーションがヒープのみを割り当てる場合、私にとっては、アプリケーションが大量のメモリを割り当てているが、実際には触れていないという兆候です。例えば:

void *p = malloc( 16u<<20 );

16MB の仮想メモリを消費します。ただし、アプリケーションがメモリ ブロックでアクションを実行しない限り、OS は仮想メモリを RAM にマップしようとさえしません。プライベート メモリの実際の割り当てを強制する最も簡単な方法は、 memset() です。

void *p = malloc( 16u<<20 );
memset( p, 0, 16u<<20 );

これはメモリリークを示していますか?アプリケーションの設計が悪い?

または両方。またはどちらでもない。

応答の長いバリアント: 不明。アプリケーションが割り当てるメモリ、アプリケーションが使用するその他のリソース、OS、ハードウェア プラットフォームなどによって異なります。

不明な場合は、 valgrindなどのメモリ リーク分析ツールを使用して調査します。C++ でのメモリ リーク解析の詳細については、SO を参照してください。

于 2010-07-27T16:37:40.417 に答える
3

断片化。

次のメモリ チャンクを割り当てる場合:

  • 16KB
  • 8KB
  • 16KB

次に、8KB のチャンクを解放すると、アプリケーションは 32KB のプライベート バイトを持ちますが、実際には 40KB バイトの仮想メモリを持ちます。これは、実際にはプロセスで使用された仮想メモリ アドレスの最大値です (他のメモリ部分は無視します)。簡単にするために)。

(可能であれば) 別のメモリ マネージャーの使用を検討してください。いくつかの代替手段は次のとおりです。

  • Windows の低断片化ヒープ (詳細については、http://msdn.microsoft.com/en-us/library/aa366750%28VS.85%29.aspx を参照してください)
  • Doug-Lea オープン ソース メモリ マネージャー
  • 買いだめのような商用の代替品

4 番目の方法は、独自のメモリ マネージャーを作成することです。そんなに簡単ではありませんが、正しく行えば、かなりの利益を得ることができます。特に、特定のニッチなアプリケーションや特別なアプリケーションでは、独自のメモリ マネージャーを作成すると便利です。

于 2010-07-27T19:16:05.407 に答える
1

メモリ割り当てには、割り当てられたものに関する管理情報を格納するためのオーバーヘッドがあります。非常に小さなバッファーを割り当てている場合、余分な情報が全体のかなりの割合になる可能性があります。それはあなたが見ているものかもしれません。

于 2010-07-27T16:33:43.853 に答える
1

1 つの可能性は、リンカー オプション /STACK:reserve_bytes を使用してスレッドに大きなスタック予約サイズを設定してから、多数のスレッドを開始した場合です。

たとえば、ATL サービスがある場合、デフォルトで 4*numberOfCores アパートメント メッセージ ディスパッチ スレッドが自動的に開始されます。このようなサービスをコンパイルして /STACK:12000000 (12 メガバイト) でリンクし、16 コア サーバーで実行すると、それぞれ 12 MB のスタックを持つ 64 のスレッドが開始され、すぐに 768 MB の仮想アドレス空間が消費されます。メモリが大幅に低下する可能性があります。

于 2012-04-08T04:13:58.133 に答える