Использование памяти в очереди <T>и странное поведение GC - PullRequest
0 голосов
/ 23 марта 2011

Вот небольшая консольная программа, с которой я играю, чтобы узнать, почему мое производственное приложение потребляет слишком много памяти:

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

Результаты немного различаются (всего несколько Ks) от пробега к бегу, но вы получите картину. Может кто-нибудь объяснить, что здесь происходит?

Моя среда: .NET4 (профиль клиента), Windows 7 x64.

1 Ответ

1 голос
/ 23 марта 2011

Вы узнали, почему джиттер не генерирует код, когда вы устанавливаете локальную переменную в ноль. Сборщик мусора уже знает, когда вы прекращаете ссылаться на объект, он не нуждается в такой помощи. Есть много книг о .NET, которые могут объяснить это вам, и Рихтера "CLR via C #" широко хвалят.

...