最終的には、ガベージ コレクター (GC) がこの作業を行います。あなたが提案するような場合、注意が必要です。この場合、GC はガベージ コレクションとアプリケーションのメモリ消費量 (ワーキング セット) に費やす時間を管理しようとするからです。その結果、アプリケーションは、特に図のような場合に、必要以上のメモリを消費する可能性があります。
CLR はこのメモリを完全に自動的に処理し、マネージド メモリの割り当てを自分で解除することはありません。たとえば、次のことを考えてみましょう
public void Test()
{
byte[] myArray = new Byte[1000];
// ...
}
実行するTest
と、1000 バイトを保持するための配列がメモリ ヒープに割り当てられます。配列は変数によって参照myArray
され、ローカル変数スタックに格納されます。このメソッドが終了すると、このローカル変数はスコープから外れます。つまり、メモリ ヒープ上の配列を参照するものは何も残っていません。その後、孤立したアレイは、GC によって再利用できるようになります。ただし、収集するかどうかに関する CLR の決定は、多くの要因 (使用可能なメモリ、メモリの現在の割り当て、最後の収集からの時間など) に基づいているため、この収集はすぐには行われない場合があります。ガベージ コレクションまでの時間。
上記に照らして、説明した場合、ループ/包含メソッドの実行中にメモリ消費が大幅に増加します。using
ここでは、ステートメントを使用する方がはるかに優れています
while (true)
{
using (Image<Gray, Byte> MyImage = new Image<Gray, Byte> (1024, 768))
{
// ...
}
}
または、各ループの後dispose()
にオブジェクトを呼び出します。Image
while (true)
{
Image<Gray, Byte> MyImage = new Image<Gray, Byte> (1024, 768);
// ...
MyImage.Dispose();
}
余談ですが、(System.Diagnostics を使用して) パフォーマンス カウンターを照会することで、いつでもこのようなメモリ消費量を自分で確認できます (プロセスの実際のメモリ消費量をテストします)。
string procName = Process.GetCurrentProcess().ProcessName;
using (PerformanceCounter pc = new PerformanceCounter("Process", "Private Bytes", procName))
Console.WriteLine(pc.NextValue());
注: パフォーマンス カウンターの読み取りには、管理者権限が必要です。