アプリケーションの 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倍の減速。これはどのように説明できますか?