Любой объект, имеющий финализатор (я предпочитаю этот термин деструктору, чтобы подчеркнуть отличие от деструкторов C ++), добавляется в очередь финализатора. Это список ссылок на объекты, которые имеют финализатор, который должен быть вызван до того, как они будут удалены.
Когда объект запущен для сборки мусора, GC обнаружит, что он находится в очереди финализатора, и переместит ссылку в свободную (f-достижимую) очередь. Это список, через который проходит фоновый поток финализатора для вызова метода финализатора каждого объекта по очереди.
Как только финализатор объекта был вызван, объект больше не находится в очереди финализатора, поэтому ГХ может удалить только обычный управляемый объект.
Все это означает, что если у объекта есть финализатор, он переживет хотя бы одну сборку мусора, прежде чем его можно будет удалить. Обычно это означает, что объект будет перемещен к следующему поколению кучи, которое включает в себя фактическое перемещение данных в памяти из одной кучи в другую.