2016-07-15 2 views
-1

ガベージコレクションプロセスを理解しようとしています。しかし、私はいくつかのコードで動作し、それは私が期待どおりに動作しません。 以下のコードでは、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() 
    { 
    } 
} 

答えて

0

正確に手動でメモリを解放しようとしているのはなぜ?正当な理由があるが、私はあなたがそれを必要とする状況にいることを確認したい。

GC.Collect()を呼び出して、オプションでパラメータを指定してガベージコレクションを強制して、収集する世代を指定することができます。このhereの詳細を読むことができます。これには、実行しようとしているものと同様のテストが含まれています。

+0

バッチコードでいくつかの操作を実行していますが、メモリに問題があります。そのため、私は手動でメモリーを解放しようとしています。 – PepeDeLew

+1

それは正当な理由ではないことが分かります。メモリを割り当てようとしたときに「メモリ圧迫」が多すぎると(つまり、メモリを解放する必要があります)、GCがそれを処理します。それはあなたのためにそれを管理するために全仕事です。それはあなたにもっと多くのメモリを割り当てる前にそれをきれいにするでしょう。メモリに関連する例外が発生している場合は、質問するのがずっと良い質問です。この場合、あなたはただのことをさせるべきです。 –

0

すべてのオブジェクトを削除したら、どのようにメモリを解放できますか?

あなたは、GCにその仕事をさせません。 (System.GC.Collect()を使用して)ガベージコレクションを強制することは、ほとんど常に悪い考えです。

+0

私はバッチ操作でいくつかのメモリの問題があります。デストラクタは呼び出されますが、メモリ使用量は長すぎますか? – PepeDeLew

+0

@TemporaryName実際にメモリに問題がある場合、再現可能な例を投稿してください。コードのどこかにメモリリークがあるかもしれません。 99.99%の時間でガベージコレクションを手動で開始する必要はありません。また、私はあなたが「デストラクタ」と呼んでいるものが分からない(C#の非常にわかりやすい言葉ではない)。それがファイナライザであると仮定すると、アンマネージリソースがない限り、おそらくそれを作成したくないでしょう。 – ken2k

+0

はい。ガベージ・コレクション・プロセスの一環として、アイテムはコレクションの準備ができているとマークされ、コレクションの準備が整った後、最終的に収集されます。ファイナライザの呼び出しは、通常、コレクションフェーズの準備段階で行われます。 –

0

これは実際にプロセスを再考する必要があるシナリオのようです。私はこれがGCと手動で対話する仕事ではないと思います。たぶんあなたが別の質問にあなたのコードのいくつかを投稿すれば、人々は問題を解決するために別の方法でいくつかのアイデアを捨てることができますか?

関連する問題