.net 排队<;T>;内存使用和奇怪的GC行为

.net 排队<;T>;内存使用和奇怪的GC行为,.net,memory,memory-leaks,garbage-collection,.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();

下面是我正在玩的一个小控制台程序,用来找出我的生产应用程序占用太多内存的原因:

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();
}}}
使用系统;
使用System.Collections.Generic;
命名空间控制台应用程序1{
班级计划{
静态void Main(字符串[]参数){
Console.WriteLine(“按键-1”);Console.ReadLine();
var q=新队列();
对于(int i=0;i<1000000;i++)
q、 排队(“测试字符串”+i);
Console.WriteLine(“按键-2”);Console.ReadLine();
q=零;
Console.WriteLine(“按键-3”);Console.ReadLine();
GC.Collect();
Console.WriteLine(“按键-4”);Console.ReadLine();
GC.Collect(2);
Console.WriteLine(“按键-5”);Console.ReadLine();
}}}
我正在运行它并在按键的同时监视Windows任务管理器。以下是我在每个步骤的内存列中看到的内容:

  • 470000
  • 61616K
  • 61596K
  • 10588K
  • 8588K
  • 每次跑步的结果略有不同(只有几公里),但你可以了解情况。有人能解释一下这是怎么回事吗


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

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

    没有否决投票,但是:它是垃圾收集的,您正在向队列添加大量数据。仅仅因为您将它设置为
    null
    ,并不意味着它消耗的内存会立即被释放。通过强制GC运行,您将删除它(尽管这是一个坏主意)。GC将在需要时运行。谢谢!那么为什么在第5步中,我的内存消耗量仍然是第1步的2倍?很难说,因为内存总量并没有告诉你消耗它的内容。它可能是额外的程序集加载或被分页的框架的其他部分。您是在查看VM使用情况还是RAM使用情况?进程使用的RAM使用情况在探索内存“泄漏”和其他性能问题时,请尝试使用性能和内存分析器。请参阅。为什么在步骤3中,进程仍在消耗61Mb内存?因为垃圾收集器尚未运行。为什么您希望它运行?如果我增加样本中的字符串数,那么所有内存都会被消耗,机器开始交换,这不会触发GC。为什么?你不能期望GC从队列中删除字符串,那将是灾难性的。它只能清理未使用的对象。