2010-06-30 4 views
7

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

ответ

7

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

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

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

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

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

+2

Существует одна волшебная вещь об методе Dispose. Он будет автоматически вызван на объект, созданный в инструкции 'using'. – tvanfosson

+0

@tvanfosson: в этом нет ничего волшебного, и это оператор 'using', который делает что-то специально предназначенное для метода Dispose, метод Dispose по-прежнему является обычным методом. – Guffa

+0

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

-1

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

Из MSDN -

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

Смотрите эту статью - http://msdn.microsoft.com/en-us/library/bb384155.aspx

+0

Не знаете, что ваш ответ там ... –

+2

Неправильное использование. Dispose используется как форма детерминированной финализации, но объекты, которые не подвергают IDisposable, по-прежнему будут собираться GC. – captaintom

+1

«-1» вы дали refference описание GC.Collect(). нет ничего похожего: «объект помечен только для сбора мусора, когда Dispose() называется« – Arseny

-1

Если вы действительно хотите, чтобы заставить использовать Garbage Collection:

GC.Collect(); 

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

What's so wrong about using GC.Collect()?

+0

Но * должен * вы вынуждаете сбор мусора? Почти во всех случаях: НЕТ! – dtb

+2

-1 Вы забыли объяснить, что код, который вы ему только что дали, не должен использоваться и почему. – Guffa

+0

Но не используйте его, если вы не уверены, что он поможет. Например, в документах говорится: «Используйте метод Collect, когда происходит значительное сокращение объема памяти, используемого в определенной точке кода вашего приложения». Я использовал его в программе, которая запускает «задания», которые выполняют значительную работу, для очистки между или сразу после заданий, что помогло уменьшить объем памяти, когда программа ничего не делала. –

9

Dispose обычно frees unmanaged resources owned by the object. Вызов Dispose не вызывает сбор мусора; ваш объект собирается, когда больше нет ссылок на него, так же, как если бы вы никогда не звонили Dispose.

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

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

+0

ОК.Всем спасибо. Я очень разбираюсь в Dispose() и сборщике мусора. –

0

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

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

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

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

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

var x = expr; 
try { ... } finally { x.Dispose(); } 
2

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

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

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

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

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

+1

В качестве альтернативы, реализация 'Dispose' часто включает вызов' GC.SuppressFinalize (this); 'так что финализация не произойдет во второй раз, когда объект собирает мусор. – Brian

0

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

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

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

+0

«Но обычно Dispose делает объект в качестве кандидата для GC.» ... um, no. – captaintom

+0

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

+0

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

0

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

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

См. MSDN для обсуждения того, как implement the IDisposable pattern.

1

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

У меня есть сообщение в блоге, которое подробно идет о when you should set variables to null to help the garbage collector (третья часть вопроса). Короткий ответ «почти никогда, если только это не статическая переменная».

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