Использование сборки "мусора"?

Я хочу знать, какое действие выполняется, когда мы звоним, Располагают () метод. Объект, освобождает все ресурсы быстро на, Располагают (), называют или Располагают (), отмечает Объект, готово к сборке "мусора". И Что произошло, когда мы устанавливаем Ссылку на объект в NULL. На самом деле у меня есть приложение форм Windows в.NET 2.0. И я хочу назвать сборщик "мусора" после того, как определенное время будет передано (Например, после 5 минут) для сбора всего не имеющего ссылки Объекта.

8
задан Stephen Cleary 30 June 2010 в 11:52
поделиться

9 ответов

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

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

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

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

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

8
ответ дан 5 December 2019 в 08:50
поделиться

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

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

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

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

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

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

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

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

2
ответ дан 5 December 2019 в 08:50
поделиться

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

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

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

0
ответ дан 5 December 2019 в 08:50
поделиться

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

Из MSDN -

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

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

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

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

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

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

10
ответ дан 5 December 2019 в 08:50
поделиться

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

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

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

0
ответ дан 5 December 2019 в 08:50
поделиться

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

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

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

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

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

var x = expr;
try { ... } finally { x.Dispose(); }
0
ответ дан 5 December 2019 в 08:50
поделиться

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

GC.Collect();

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

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

-1
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

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