Выбор ответа Middle GC, IDisposable и производительность обновлено
Финализатор и сборка мусора
Вопрос
Чем плох финализатор (~MyClass()) у класса без неуправляемых ресурсов?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Объект переживает лишнюю сборку: сначала он идёт в очередь финализации. Объект с финализатором при создании регистрируется в списке финализации.
Варианты ответа
- Объект переживает лишнюю сборку: сначала он идёт в очередь финализацииправильный ответ
- Финализатор вызывается сразу при выходе объекта из области видимости
- Финализатор запрещает вызывать
Disposeу объекта этого класса - Финализатор вызывается в UI-потоке и блокирует интерфейс приложения
Разбор
Объект с финализатором при создании регистрируется в списке финализации. Когда он становится недостижимым, GC не освобождает его, а ставит в очередь, поток финализации вызывает ~MyClass(), и только следующая сборка забирает память. Объект и всё, на что он ссылается, продвигаются в старшее поколение. Время вызова не детерминировано, поток отдельный. Финализатор нужен лишь как страховка для неуправляемых ресурсов, лучше через SafeHandle.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «GC, IDisposable и производительность»
- ArrayPool и аренда буферов
- Где выделит память лямбда в цикле
- Зачем GC.SuppressFinalize в Dispose
- Поколения сборщика мусора
- Когда реализовывать IDisposable
- Быстрый разбор большого ввода
- FizzBuzz с быстрым выводом
- Свой wc: строки, слова, максимальная длина