。净。为什么垃圾收集器在清除列表时不会运行?

时间:2015-10-14 09:44:57

标签: .net garbage-collection

我多次向列表添加20 Mb,以便应用程序消耗600 MB。但是,为什么我清除列表,内存没有被释放。

这是我的代码

List<int> data = new List<int>();
const int TwentyMB = 20 * 1024 * 1024;

public MainForm()
{
    InitializeComponent();
}

private void AddDataButton_Click(object sender, EventArgs e)
{
    for (var i = 0; i < TwentyMB; i++)
    {
        data.Add(i);
    }
}

private void DestroyButton_Click(object sender, EventArgs e)
{
    data.Clear();
    data.Capacity = 0;
}

直到我调用GC.Collect,内存被释放

private void CollectButton_Click(object sender, EventArgs e)
{
    GC.Collect();
}

谁能告诉我为什么记忆不会释放? GC何时自动工作?

2 个答案:

答案 0 :(得分:2)

因为系统不需要内存。 GC尽可能少地工作。

答案 1 :(得分:1)

触发垃圾收集的条件:

  • 系统物理内存不足。
  • 托管堆上已分配对象使用的内存超过可接受的阈值。随着流程的运行,该阈值会不断调整。
  • 调用GC.Collect方法。几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于独特的情况和测试。

垃圾收集时间可能因运行的计算机和可用资源而异。在你的情况下,你可以看到调用GC.Collect实际上释放了内存,所以没有什么可担心的。如果你在清除清单后等待几分钟,你可能会看到同样的事情发生,但正如我所说,这个时间会有所不同