为什么这个对象不是垃圾收集的

Joh*_*nyy 5 c# garbage-collection

在下面的代码段中,我想知道为什么testvectors在函数调用后没有收集.我看到内存使用量高达270Mb,然后永远呆在那里.

此功能直接从Main调用.

private static void increaseMemoryUsage()
{
    List<List<float>> testvectors = new List<List<float>>();
    int vectorNum = 250 * 250;
    Random rand = new Random();

    for (int i = 0; i < vectorNum; i++)
    {
        List<Single> vec = new List<Single>();

        for (int j = 0; j < 1000; j++)
                {
            vec.Add((Single)rand.NextDouble());
        }
        testvectors.Add(vec);
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 9

不要将垃圾收集与引用计数混淆.运行时决定释放内存,而不是总是在不再引用内存时释放内存.报价:

当满足下列条件之一时,将发生垃圾收集:

系统物理内存较低.

托管堆上已分配对象使用的内存超过可接受的阈值.这意味着托管堆上已超出可接受内存使用量的阈值.在该过程运行时不断调整该阈值.

调用GC.Collect方法.几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行.此方法主要用于独特的情况和测试.

如果您有兴趣,请阅读此内容:

http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx


Cod*_*aos 5

GC可以在需要时运行.这可能会晚得多.在最后一次引用消失后,没有义务直接释放一些内存.您的阵列将在下一代Gen2集合中收集.

除非你继续分配内存,否则在函数返回后它可能永远不会运行.

您可以手动触发GC GC.Collect(),但通常不鼓励这样做.

  • 系统的信息比程序员少。例如,它不知道您刚刚杀死了对 200MB 数据的最后一个引用。所以手动调用它,在这种情况下可能是合理的。不幸的是,没有好的方法可以告诉 GC 您不再需要大量内存,而不强制它运行。 (2认同)