Подтвердить что ты не робот

Когда запускается сборщик мусора .net?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Всякий раз, когда это кажется

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

Ответ 5

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

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

Ответ 6

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