17

私のアプリケーションは数時間実行されますが、タスク マネージャーの値 (vmsize、メモリ) に増加はありません。しかし、数時間後にメモリエラーが発生します。

sysinternals では、「仮想サイズ」が継続的に増加していることがわかります。約 2 GB に達すると、メモリ エラーが発生し始めます。

それで、それはどのようなメモリリークですか?コードでそれを示すにはどうすればよいですか? メモリ値が増加せず、sysinternsl プロセス エクスプローラーの仮想サイズのみが増加する任意のコードで同じことを再現することは可能ですか?

提案をありがとう

4

4 に答える 4

11

仮想サイズは、プロセスが割り当てたページの数です。現在ワーキング セットにないページ (RAM に物理的にロードされているページ) は、システムのページ ファイルにあります。

通常、解放されていないメモリを割り当てます。たとえば、Rational Purify や Boundschecker などの特別なツールを使用しないと、コード内でこれを追跡するのは困難です。sysinternals を使用すると、リークがあるに違いないことがわかりますが、どこにあるのかはわかりません...

ソフトウェアがそれほど大きくない場合は、「新規」および「削除」をログアウトして、割り当てられたオブジェクトのリストを管理することにより、メモリ内にオブジェクトが多すぎるかどうかを確認できます (独自のメモリ デバッガを作成します)。Windows の世界には、Microsoft の CRT メモリ チェック ユーティリティのようなヘルパーがいくつかあります。場合によっては便利です。

于 2010-06-12T22:26:18.367 に答える
4

物事の音から、アドレス空間が不足しています。32 ビット Windows では、アドレス空間がユーザー プログラム用とシステム用の半分に分割されるため、それぞれが 2 ギガバイトを取得します。

これの最も一般的な原因は、割り当てに十分な大きさのチャンクが見つからない点までメモリ空間を断片化することです。残念ながら、あなたが何をしているのかをもっと知らなければ、なぜそれが起こっているのかを推測することは困難です.

于 2010-06-12T22:20:24.403 に答える
3

sysinternals フォーラムのこのスレッドによると、仮想サイズはプロセスのアドレス空間に対応します (メモリのコミット済みページと予約済みページを推測しています)。

于 2010-06-12T22:30:12.093 に答える
2

仮想サイズには、次のタイプの割り当て済みページが含まれているようです: MEM_MAPPED (データ ビュー用) MEM_IMAGE (実行可能イメージ ビュー用) MEM_PRIVATE (通常の割り当て済みページ メモリ)

データ用の唯一の「メモリ」ではなく、*.dll-s および FileMapping メカニズム用のページ スペースも含まれます。

于 2014-09-09T08:52:28.770 に答える