Использование сбора мусора? - PullRequest
7 голосов
/ 30 июня 2010

Я хочу знать, какое действие выполняется, когда мы вызываем метод Dispose (). Is Object быстро освобождает все ресурсы при вызове Dispose () или Dispose (), отмечая, что объект готов для сборки мусора И что случилось, когда мы установили ссылку на объект на NULL. На самом деле у меня есть приложение Windows Form в .NET 2.0. И я хочу вызвать сборщик мусора по истечении определенного времени (например, через 5 минут), чтобы собрать все объекты, на которые нет ссылок.

Ответы [ 9 ]

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

Dispose обычно освобождает неуправляемые ресурсы, принадлежащие объекту . Вызов Dispose не запускает сборку мусора; ваш объект собирается, когда на него больше нет ссылок, так же, как если бы вы никогда не вызывали Dispose.

Установка ссылки на объект на null просто приводит к тому, что эта ссылка больше не указывает на этот объект; вам обычно не нужно этого делать (например, вам почти никогда не нужно устанавливать локальные переменные на null).

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

7 голосов
/ 30 июня 2010

В методе Dispose нет ничего волшебного, он похож на любой другой метод. Вызов метода Dispose не выполняет никакой очистки в фоновом режиме и не изменяет состояние объекта, он просто выполняет то, что вы поместили в метод. Что особенного в этом то, что он определен в интерфейсе IDisposable, так что это стандартный способ сообщить объекту, что он очищает свои ресурсы.

В методе Dispose объект должен заботиться обо всех неуправляемых ресурсах, таких как соединения с базой данных и объекты Font.

Когда вы освобождаете объект, вам не нужно беспокоиться о каких-либо управляемых ресурсах. Структура типа байтового массива полностью обрабатывается сборщиком мусора, и вы можете просто оставить его в объекте, когда отпустите его. Вам не нужно устанавливать никаких ссылок на null, когда вы больше не используете объект, сборщик мусора найдет наилучшее время для его удаления и любых объектов, на которые он ссылается.

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

Вам может показаться, что вы должны стараться поддерживать низкое использование памяти, но само по себе это не дает никаких преимуществ. Компьютер не работает лучше, потому что у него осталось больше свободной памяти. Напротив, если ваш код пытается выполнить очистку или заставляет сборщик мусора делать что-либо, он выполняет очистку, когда он должен быть занят чем-то более важным. Сборщик мусора очистит неиспользуемый объект, если он понадобится.

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

Объект доступен для GC, когда на него нет ссылок.Если у него есть ссылки, хранящиеся в течение определенного периода времени (управляемый сборщиком мусора), он начинает продвигаться через так называемые «поколения».

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

Действия, выполняемые методом Dispose, полностью контролируются программистом, насколько вы знаете,он может ничего не делать.

Сборщик мусора не интересуется методами Dispose - но через Finalizer вполне вероятно, что логика Dispose объекта будет вызываться в любом случае - люди, следующие шаблону IDisposable, реализуют финализатор какпоследний канун «вы забыли вызвать Dispose, так что я сделаю это непосредственно перед тем, как GC убьет меня», способ очистки ресурсов.

Обратите внимание, что любые управляемые ресурсы в конечном итоге будут GC'd (если ссылки не хранятся)если Dispose не называется.Однако неуправляемые ресурсы будут возвращены только после завершения всего процесса приложения (а также любых управляемых ресурсов с сохраненными ссылками).

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

Другие люди в достаточной мере ответили на вопросы "как IDisposable взаимодействует с сборщиком мусора" и "когда мне следует позвонить GC.Collect" на части вопроса.

У меня есть сообщение в блогеподробно о , когда вы должны установить переменные на null, чтобы помочь сборщику мусора (третья часть вопроса).Краткий ответ: «почти никогда, если только это не статическая переменная».

0 голосов
/ 30 июня 2010

Утилита, если она реализована правильно, будет распоряжаться всеми имеющимися у нее управляемыми ресурсами, которые реализуют IDisposable, и немедленно освобождает любые неуправляемые ресурсы.Сам объект будет помечен для сбора, когда на него нет ссылок.Обычно объект используется в блоке с использованием блока , и метод Dispose вызывается в конце блока автоматически, при этом объект выходит из области видимости и в то время может быть выбран для сбора.

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

См. MSDN для обсуждения того, как реализовать шаблон IDisposable .

0 голосов
/ 30 июня 2010

Для объектов вашего класса вы определяете, что будет делать Dispose. Вы реализуете IDisposable интерфейс, который содержит метод Dispose и зависит от реализации. Но обычно цель Dispose состоит в том, чтобы высвободить ресурсы (управляемые / неуправляемые) и сделать объект кандидатом на GC.

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

Для вызова Collect не предлагается (пока у вас нет крайней необходимости и аргументов для этого), поскольку GC оптимизировал, чтобы знать, какое время подходит для Collection.

0 голосов
/ 30 июня 2010

Смысл автоматической сборки мусора в том, что вам не нужно беспокоиться об освобождении объектов . Не пытайтесь «помочь» сборщику мусора.

Объекты в конечном итоге собираются после того, как они выходят из области видимости. Невозможно вручную «освободить» объект или пометить его для более быстрой сборки мусора. Просто помните, какие объекты находятся в области видимости (или на которые ссылаются объекты в области видимости).

Метод Dispose - это просто метод. Это не имеет ничего общего со сборкой мусора. «Dispose» - это имя метода, вызываемого оператором using:

using (var x = expr) { ... }

в основном эквивалентно

var x = expr;
try { ... } finally { x.Dispose(); }
0 голосов
/ 30 июня 2010

Если вы действительно хотите форсировать сборку мусора, используйте:

GC.Collect();

Пожалуйста, смотрите этот пост по причинам, по которым вы не должны его использовать:

Что плохого в использовании GC.Collect ()?

0 голосов
/ 30 июня 2010

Объект помечается только для сборки мусора, когда вызывается Dispose (). <- Обновление: это неправильно. Dispose () на самом деле ничего не делает, если только он не вызывается вами или компилятором (при использовании в конструкции using). </p>

Из MSDN -

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

См. Эту статью - http://msdn.microsoft.com/en-us/library/bb384155.aspx

...