ガベージコレクションプロセスを理解しようとしています。しかし、私はいくつかのコードで動作し、それは私が期待どおりに動作しません。 以下のコードでは、1.000.000オブジェクトを作成してリストに追加しました。しばらくすると、オブジェクトはありませんが、メモリはスタックし、減少しません。すべてのオブジェクトが削除された後、どのようにしてメモリを解放することができますか?オブジェクトとリストで使用されているメモリを解放する
おかげ
private void button1_Click(object sender, EventArgs e)
{
List<Test> tesst = new List<Test>();
for (long i = 0; i < 1000000; i++)
{
using (Test test = new Test())
{
test.LongObj = i;
test.StrObj = i.ToString();
test.DecObj = Convert.ToDecimal(i);
tesst.Add(test);
}
}
Process proc = Process.GetCurrentProcess();
proc.Refresh();
label1.Text = Test.counter.ToString();
label2.Text = (proc.PrivateMemorySize64/1048576).ToString();
for (int i = 0; i < tesst.Count; i++)
{
tesst[i] = null;
}
tesst.Clear();
tesst = null;
}
private void button2_Click(object sender, EventArgs e)
{
Process proc = Process.GetCurrentProcess();
proc.Refresh();
label1.Text = Test.counter.ToString();
label2.Text = (proc.PrivateMemorySize64/1048576).ToString();
}
とサンプルクラス
public class Test : IDisposable
{
public static long counter = 0;
public long LongObj { get; set; }
public string StrObj { get; set; }
public decimal DecObj { get; set; }
public Test()
{
Interlocked.Increment(ref counter);
}
~Test()
{
Interlocked.Decrement(ref counter);
}
public void Dispose()
{
}
}
バッチコードでいくつかの操作を実行していますが、メモリに問題があります。そのため、私は手動でメモリーを解放しようとしています。 – PepeDeLew
それは正当な理由ではないことが分かります。メモリを割り当てようとしたときに「メモリ圧迫」が多すぎると(つまり、メモリを解放する必要があります)、GCがそれを処理します。それはあなたのためにそれを管理するために全仕事です。それはあなたにもっと多くのメモリを割り当てる前にそれをきれいにするでしょう。メモリに関連する例外が発生している場合は、質問するのがずっと良い質問です。この場合、あなたはただのことをさせるべきです。 –