2010-06-21 3 views
12

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

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

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

+1

Зачем вам нужно знать, когда это работает? –

+0

Сборщик мусора собирает (по определению) мусор, т. Е. Объекты, которые больше не ссылаются на вашу программу. – Ken

+8

Задавая этот вопрос, вы спрашиваете босса-моба, когда его следующая партия наркотиков должна прибыть. Ответ был «ничем из твоих фантазийных дел», за которым последовала фирма: smack :: на заднюю часть головы :) –

ответ

5

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

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

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

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

9

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

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

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

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

+0

Я нашел документацию, которая указывает, что .net отслеживает память и оптимизирует GC-трассы на основе этого. Означает ли это, что я нахожусь на холоде, если мне нужно, чтобы GC запускал бесплатные подключения к SQL-серверу? –

+0

@Rising Star: Нет. SQL-соединение - отдельная проблема из памяти. Вы можете закрыть его вручную через conn.Close(): http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx –

+0

Hrm ... Почему здесь работает downvoting? –

1

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

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

2

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

В .NET сборщик мусора является generational garbage collector. Есть определенно метод безумия, но это не то, что вы можете точно предсказать.

3

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

0

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

Смежные вопросы