Трассирующий сборщик подает еще более слабую надежду, чем счетчик ссылок. В силу некоторых причин эта система более интенсивно использует отложенные вычисления при исполнении кода завершения. У объектов есть
завершители
(finalizers) — методы, которые исполняются, когда объект более недоступен программе. Плюс трассировки в том, что циклы для нее не проблема, а еще больший плюс — что присваивание ссылки представляет собой простую операцию перемещения (об этом чуть позже). За это приходится расплачиваться гарантиями того, что код завершения будет исполнен "сразу" по выходу ссылки из употребления. Ну, а какие гарантии тогда вообще даются? Суть в том, что для корректно работающих программ вызываются завершители объектов (сбойные программы терпят крах или переводят завершитель в бесконечный цикл). Онлайновая документация в этом вопросе проявляет тенденцию к чрезмерной осторожности. Но если у объекта есть метод
Finalize,
система его вызовет. Проблемы детерминированного завершения это не решает, но важно понимать, что при этом все же производится сбор ресурсов и завершители являются эффективным средством предотвращения утечки ресурсов в программе.