最近の投稿で(私のプログラムはメモリを解放しません。なぜですか?)FastMMを使用すると、アプリケーションがシステムに大量のメモリを解放しないことを示します。最近、私は人工的なテストプログラムを作成して、問題がメモリではなく、FastMMでのみ表示されることを確認しました。
このプログラムでは、オブジェクト(前の投稿で使用したものと同じ)を500回作成および破棄します。
メモリ要件は次のとおりです(「プライベートワーキングセット」):
FastMMなし
ループを実行する前:1.2MBループ
を実行した後 :2.1MB
FastMM(アグレッシブデバッグモード)を使用
する場合ループを実行する前:2.1MBループ
を実行した後:25MB
FastMM(リリースモード)
の場合ループを実行する前:1.8MBループ
を実行した後:3MB
ループを数回実行しても、メモリ要件は増加しません。これは、解放されていないメモリが再利用されるため、これがメモリリークではないことを意味します(メモリリークは、実行ごとに数KB / MBのメモリフットプリントを増加させます)。
私の質問は次のとおりです。
FastMMでこの動作を無効にするにはどうすればよいですか?それも可能ですか?FastMMなしまたはFastMMリリースモードを使用してプログラムをリリースすると、適度な量のRAMが「浪費」されることはわかっています。ただし、この動作をオンデマンドで無効にすると、メモリリークを特定するのに役立ちます(私たち?)。実際、私の最初の投稿(リンクを参照)では、多くの人が私にリークがあると示唆しました。混乱は明らかにこの振る舞いのために作成されました。いいえ、漏れがないことは明らかです。大量のメモリを解放することを拒否するのは、メモリマネージャだけです。
余分なメモリを解放しますか?いつ?これを引き起こすものは何ですか?プログラマーはそれをトリガーできますか?たとえば、RAMを大量に消費するタスクを完了し、ユーザーがプログラムをしばらく使用できない(最小化する)可能性があることがわかっている場合、RAMをシステムにフラッシュして戻すことはできますか?ユーザーが私のプログラムの複数のインスタンスを開くとどうなりますか?彼らはRAMをめぐって競争しませんか?