释放对象和列表使用的内存

时间:2016-07-15 14:20:36

标签: c# memory memory-management garbage-collection

我正在尝试了解垃圾收集过程,我想我明白了。但是当我处理一些代码时,它并没有像我预期的那样工作。 在下面的代码中,我刚刚创建了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()
    {
    }
}

3 个答案:

答案 0 :(得分:0)

为什么要尝试手动释放内存?有正当理由,但我想确保您处于需要它的情况。

您可以通过调用GC.Collect()强制执行垃圾回收,并可选择使用参数告诉它要收集哪一代。您可以阅读有关此here的更多信息,其中包含与您尝试执行的操作类似的测试。

答案 1 :(得分:0)

  

如何在删除所有对象后释放内存?

你不能让GC完成它的工作。强制垃圾收集(使用System.GC.Collect())几乎总是一个坏主意。

答案 2 :(得分:0)

这看起来像是一个需要重新思考过程的场景。我不认为这是手动与GC交互的工作。也许如果你用不同的问题发布一些代码,人们可以用不同的方式抛出一些想法来解决问题?