Когда сборщик "мусора" .NET работает?

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

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

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

13
задан Daniel Allen Langdon 21 June 2010 в 21:59
поделиться

4 ответа

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

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

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

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

5
ответ дан 1 December 2019 в 22:22
поделиться

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

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

2
ответ дан 1 December 2019 в 22:22
поделиться

В платформе .NET вас запускает GarbageCollector.

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

2
ответ дан 1 December 2019 в 22:22
поделиться

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

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

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

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

9
ответ дан 1 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: