2014-11-12 5 views
0

Угадайте, что название должно было предоставить вам достаточное представление о том, что я хочу знать, но я должен подробно его продумать здесь, чтобы вы могли получить точную идею.Объекты, содержащие метод FINALIZE?

Я знаю следующее о методе Finalize:

  1. Нам нужно создать деструктор в C# с использованием ~Classname внутри класса. Согласно C#, Finalize & деструкторы - синонимы (я прочитал его на MSDN, я не знаю, является ли последняя часть утверждения даже правильной или нет).

  2. Используется для «изящества освобождения неуправляемых ресурсов».

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

  4. Любой объект, имеющий метод Finalize, будет добавлен в очередь завершения во время выполнения.

следующее изображение взято из MSDN Magazine Article. Он показывает корни, управляемую кучу (MH), завершающую очередь (FQ) & Freachable Queue (F-RQ). Все это происходит во время выполнения.

IMAGE 1


Мои вопросы заключаются в следующем:

  1. Как ссылки на, объекты присутствуют в MH добавляются FQ? (Значит, они автоматически добавляются в FQ, потому что они имеют Finalize или GC добавляет их, сохраняя их дорожку.)

  2. Проводит ли GC через FQ, а также очищает ссылки? (Для ссылок на объекты, которые использует GC.SuppressFinalization.)

  3. Если MH имеет достаточно памяти для входящих объектов в течение некоторого времени, но в то же время специальная нить в F-RQ делается с Finalize методом ссылки (ами), присутствующий в F-RQ, то в этот момент GC будет запускаться специально для F-RQ для восстановления памяти или будет выполняться как для MH & F-RQ, так и будет ли он ждать, пока MH не упадет в памяти?

EDIT:

На вопрос 3: Рассмотрим следующий образ со всеми ссылками на F-RQ не достижимой.

IMAGE2

Если есть какие-либо ошибки (ы) в выше указанные вопросы или знания, не стесняйтесь указывать это & объяснение к нему будет очень ценна.

ответ

2
  1. GC добавляет объекты в очередь финализатора, когда у них есть финализатор. Я не понимаю ваше различие между «автоматически добавляется, потому что они имеют Finalize» и «GC добавляет их». GC добавляет их , потому что у них есть финализатор. С точки зрения программиста это автоматическое.

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

  3. Да. То есть во-первых, нет ни одного «GC» и hellip, существует несколько различных реализаций .NET. Во-вторых, GC является достаточно сложным, что его поведение не может быть так обобщено.

Обратите внимание, что все это детализация реализации. Вот что мы, как нужно пользователям C# знать:

  • Если мы используем неуправляемые ресурсы, которые не могут управляться через SafeHandle класса, нам нужно добавить финализации к нашему классу, и в выпуске финализатора этих ресурсов.
  • Нам также необходимо реализовать IDisposable в этом случае (среди прочих), а в нашем вызове реализации GC.SuppressFinalize() так, чтобы GC знал, что не тратит время на запуск нашего финализатора.

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

В дополнение к статье вы уже ссылочного, Вам также может быть интересно:

MSDN Blogs > cbrumme's WebLog > Finalization

Object.Finalize Method – How finalization works

SO: Generational Garbage collection Vs Garbage collection in .NET

+0

@Peter К ** 'автоматически добавляется потому, что они have Finalize' ** Я имею в виду, если у объекта есть метод ** Finalize' **, он автоматически переходит к ** 'FQ' ** самостоятельно во время выполнения. И ** ** GC добавляет их ** Я имею в виду, что когда объект имеет метод ** Finalize' **, чем во время выполнения, он отслеживается добавлением ** 'GC' ** в **' FQ' * *. – barnes

+0

@ LasseV.Karlsen Не обижайтесь, но, насколько я знаю, ** 'Finalize Queue' ** & **' F-Reachable Queue' ** или ** 'Freachable Queue' ** - это две разные структуры данных , оба контролируются ** 'GC' ** – barnes

+0

@PeterDuniho Во время выполнения, когда' GC' находит любые объекты с 'Finalize', он добавляет его в **' MH' ** и их ссылки на ** 'FQ' * * и для выполнения их ** 'Fianlize' ** метода **' GC' ** добавляет объект в ** 'F-RQ' **. – barnes