Когда запускается сборщик мусора .net? - PullRequest
12 голосов
/ 22 июня 2010

Когда я отлаживаю код .net, как узнать, когда работает сборщик мусора?

Я не хочу контролировать, когда работает сборщик мусора. Я только хочу знать, когда он работает. У меня есть код, который исчерпал ресурсы. Я знаю, что ресурсы не используются; Я хочу знать, когда GC работает, чтобы освободить их.

О, и ресурсы, которые я имею в виду, это соединения из пула соединений Sql, а не память:

Ответы [ 6 ]

9 голосов
/ 22 июня 2010

В общем, вы не должны беспокоиться или думать о том, когда запускается GC.

Сборщик мусора будет работать по мере необходимости в неопределенное время, выбранное средой выполнения.

Если вы хотите более точный контроль зерна над ГХ (что я не рекомендую, за исключением очень специфических обстоятельств), вы можете использовать GC.AddMemoryPressure и GC.RemoveMemoryPressure . Это не заставит GC работать, а скорее намекает на то, что в игре есть другая память, кроме выделенной CLR, управляемой памяти. Это может привести к более частому запуску, что может быть полезно, если вы выделяете большие блоки памяти в собственном коде.

Нет прямого API для отслеживания прогонов GC. (Например, класс GC не содержит никаких событий, уведомляющих о том, что происходит сборка мусора.) Единственный прямой способ узнать, в частности, когда GC выполняется, - это использовать API профилирования .

5 голосов
/ 22 июня 2010

Вы должны использовать .NET 4.0, то, что вы запрашиваете, не поддерживается в более ранних версиях.

По сути, вы вызываете методы WaitForFullGCApproach и WaitForFullGCComplete в цикле. WaitForFullGCApproach будет блокировать до тех пор, пока вы не увидите GC, WaitForFullGCComplete будет блокировать до завершения GC.

Пожалуйста, внимательно прочитайте эту статью. Если вы используете этот метод, то вы несете ответственность за то, чтобы убедиться, что сборка мусора действительно происходит. Если вы испортите это, вы можете сломать ГХ и быстро исчерпать память.

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

3 голосов
/ 26 октября 2011

сборка мусора не освобождает ваши пулы соединений с базой данных.соединения возвращаются в пул при закрытии / удалении объекта соединения.сам пул соединений управляет, когда ему нужно открыть больше соединений и снова закрыть их, в зависимости от того, насколько сильно вы ударили по пулу и вашей конфигурации пула в строке соединения.сборка мусора никак не связана с этим, кроме как освободить память, выделенную для экземпляров SqlConnection.вы лаете не по адресу, спрашивая о сборе мусора и получая (и принимая) ответы, которые не имеют ничего общего с тем, что вам нужно (если я правильно понимаю ваш вопрос).

2 голосов
/ 22 июня 2010

Всякий раз, когда хочется,

Сборщик мусора .NET - это сборщик мусора поколений . Безусловно, есть метод для безумия, но это не совсем то, что вы можете точно предсказать.

1 голос
/ 22 июня 2010

В .NET Framework, GarbageCollector запускает вас.

На полном серьезе .Net настроен на оптимизацию GC. Это может произойти в конце вызова метода или может выполняться в течение дня без необходимости GC'd. Есть ли какая-то конкретная причина, по которой вам нужно знать, когда она собирается?

0 голосов
/ 23 апреля 2015

Две основные причины запуска GC: а) если поколение 0 заполнено б) когда куча заполнена.вежливость - CLR Via C #, Джеффри Рихтер

...