数千の大きなファイル(サイズが10MBから100MBの間)を圧縮するCプログラムをSuse Linux Enterpriseで実行すると、プログラムの実行に伴ってプログラムがどんどん遅くなります(Intel Sandy Bridgeボードで32スレッドのマルチスレッドで実行されています)。 )。プログラムが完了し、再度実行されても、まだ非常に遅いです。
プログラムの実行を見ると、プログラムの実行中にメモリが使い果たされていることがわかります。これは、古典的なメモリリークの問題であると思われます。ただし、通常のmalloc()/ free()の不一致では、プログラムの終了時にすべてのメモリが返されると思います。ただし、プログラムの完了時にほとんどのメモリは再利用されません。freeまたはtopコマンドは、Mem:合計63996M、使用済み63724M、プログラムの速度が低下して停止した場合は272Mの空きを示しますが、終了後、空きメモリは約3660Mにしか戻りません。プログラムを再実行すると、空きメモリがすぐに使い果たされます。
一番上のプログラムは、実行中にプログラムがメモリの最大4%程度を使用していることを示しているだけです。
これはメモリの断片化の問題かもしれないと思いましたが、プログラム内のすべてのメモリ割り当てアクティビティをシミュレートする小さなテストプログラムを作成しました(多くのランダム化された側面が組み込まれています-サイズ/数量)。完了。だから、それだけではないと思います。
質問:
プロセスが完了した後でも、メモリを永久に失うmalloc()/ free()の不一致が存在する可能性はありますか?
Cプログラム(C ++ではない)の他にどのようなことが永続的なメモリ損失を引き起こす可能性がありますか?つまり、プログラムが完了し、ターミナルウィンドウが閉じた後ですか?再起動するだけでメモリが元に戻ります。ファイルが閉じられずに問題が発生するという他の投稿を読んだことがありますが、その問題はないと思います。
記憶の統計を上から見て自由にすることは有効ですか?つまり、記憶の状況を正確に説明していますか?それらはプログラムの遅さに対応しているようです。
プログラムが4%のメモリ使用量しか示さない場合、valgrindのようなものがこの問題を見つけますか?