1

アプリケーションの 1 つで大量のメモリ リークが発生しました。メモリ リークが発生すると、コンピュータの動作が非常に遅くなります。リークを修正する前に、なぜそれが起こるのかを理解したいと思います。

たとえば、リークのある次の小さな C++ コードを見てください。

size_t size = 1024 * 1024 * 1024;
char* buf = new char[size];
std::fill_n(buf, size, 'o');
std::string pause;
std::getline(std::cin, pause);

仮想メモリ、ディスク キャッシュなどに関する私の理解から、上記のコードが最後の行でユーザー入力を待機している間、その 1 ギガバイトのバッファーはもう使用されていないため、オペレーティング システムは徐々にそれをスワップする必要があると予想します。ディスクを「忘れる」。私 (ユーザー) はしばらく速度が低下しますが、しばらくすると正常に戻ります。

これは、私のシステム (Windows XP、32 ビット、2 GB の RAM) では発生しません。上記のコードを実行すると (cmd使用可能なすべてのメモリを浪費するために、2 つの別々のウィンドウで 2 回)、システムの速度が大幅に低下したように感じます。数分後には良くなりますが、最大のパフォーマンスには近づきません。リークしている「アプリケーション」を終了すると、システムは正常に戻ります。

いくつかの数値を示すために、いくつかのソース コードのコンパイルをパフォーマンス テストとして使用しました。いくつかの測定(秒単位)を行うために、連続して数回コンパイルしました。

  • リーク前: 14、2、2、3、2、...
  • リーク後: 183、40、9、7、9、...
  • リークしている「アプリケーション」を閉じた後: 12、2、2、...

私が何も期待しないところで3倍の減速。これはどのように説明できますか?

4

1 に答える 1

1

Windows スワップ ファイルのサイズは有限です。そのほとんどが 1GB のバッファでいっぱいになると、システムは残りのメモリをほとんど残っていないものから出し入れして、よりハードに動作する必要があります。

于 2011-03-29T20:54:24.370 に答える