队列<t>内存使用和奇怪的GC行为</t>

时间:2011-03-23 15:41:42

标签: .net memory memory-leaks garbage-collection

这是我正在玩的一个小型控制台程序,以找出我的生产应用程序消耗太多内存的原因:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Press key - 1"); Console.ReadLine();

            var q = new Queue<string>();
            for (int i = 0; i < 1000000; i++)
                q.Enqueue("test string" + i);
            Console.WriteLine("Press key - 2"); Console.ReadLine();

            q = null;
            Console.WriteLine("Press key - 3"); Console.ReadLine();

            GC.Collect();
            Console.WriteLine("Press key - 4"); Console.ReadLine();

            GC.Collect(2);
            Console.WriteLine("Press key - 5"); Console.ReadLine();
}}}

我正在运行它并在按下键的同时监视Windows任务管理器。以下是我在每个步骤的内存列中看到的内容:

  1. 4 700K
  2. 61 616K
  3. 61 596K
  4. 10 588K
  5. 8 588K
  6. 从运行到运行结果略有不同(只有几Ks),但是你得到的结果。可以请某人解释这里发生了什么吗?

    我的环境:.NET4(客户端配置文件),Windows 7 x64。

1 个答案:

答案 0 :(得分:1)

您发现在将局部变量设置为null时抖动不会生成代码的原因。垃圾收集器已经知道你何时停止引用一个对象,它不需要那样的帮助。有很多关于.NET的书可以向你解释,里希特的“CLR来自C#”受到广泛赞誉。