FastMM4 メモリ マネージャーが組み込まれている Delphi 2009 を使用しています。
私のプログラムは、大きなデータセットを読み込んで処理します。データセットをクリアするか、プログラムを終了するたびに、すべてのメモリが正しく解放されます。メモリリークはまったくありません。
spenwarr の回答にある CurrentMemoryUsage ルーチンを使用して、「 Delphi プログラムで使用されるメモリを取得する方法 」で、処理中に FastMM4 で使用されるメモリを表示しました。
発生しているように見えるのは、プロセスとリリースサイクルごとにメモリの使用量が増加していることです。例えば:
データセットなしでプログラムを開始した後、1,456 KB が使用されました。
大規模なデータセットを読み込んだ後、218,455 KB が使用されました。
データセットを完全にクリアした後は 71,994 KB。この時点 (またはこの例の任意の時点) で終了すると、メモリ リークは報告されません。
同じデータセットを再度読み込んだ後、271,905 KB が使用されました。
データセットを完全にクリアした後の 125,443 KB。
同じデータセットを再度読み込んだ後、325,519 KB が使用されました。
データセットを完全にクリアした後の 179,059 KB。
同じデータセットを再度読み込んだ後、378,752 KB が使用されました。
プログラムのメモリ使用量は、ロード/クリア サイクルごとに約 53,400 KB 増加しているようです。タスク マネージャーは、これが実際に起こっていることを確認します。
FastMM4 は、オブジェクトが解放されたときに、プログラムのすべてのメモリをオペレーティング システムに戻すとは限らないため、さらに必要なときにメモリを保持できると聞いたことがあります。しかし、この継続的な成長は私を悩ませます。メモリ リークは報告されていないため、問題を特定できません。
なぜこれが起こっているのか、それが悪いのか、それについて私にできること、またはすべきことがあるかどうか、誰かが知っていますか?
答えてくれたdthorpeとMasonに感謝します。あなたは私が何かを見逃していることに気づかせてくれたものを考えさせ、試しさせました. そのため、詳細なデバッグが必要でした。
結局のところ、終了時にすべての構造が適切に解放されていました。しかし、実行中の各サイクル後のメモリ解放はそうではありませんでした。私の終了クリーンアップが正しくなかった場合、通常は終了時に検出可能なリークを引き起こすメモリブロックが蓄積されていましたが、そうでした。
サイクル間でクリアする必要のあるいくつかの StringLists とその他の構造がありました。以前のサイクルから残っている余分なデータを使用して、プログラムがどのように正しく機能したかはまだわかりませんが、機能しました。私はおそらくそれをさらに研究します。
この質問には回答済みです。ご協力いただきありがとうございます。