Тот факт, что у вас есть метод финализатора, может сбить вас с толку. Когда объект имеет финализатор и становится пригодным для сбора, GC добавит его в список финализаторов. Этот список обрабатывается отдельным потоком JVM, что означает, что финализатор не гарантированно будет запущен в любой момент (или даже до выхода из программы).
Из-за этого каждому объекту требуется минимум из двух циклов GC, которые необходимо собрать. Первый добавляет его в список финализаторов и, при условии, что финализатор будет обработан до следующего GC, будет собран в следующий раз. Тем не менее, может быть гораздо больше циклов GC, прежде чем он будет собран, если вообще когда-либо.
Финализаторы никогда не были сильной особенностью в Java, и метод Object.finalize()
был объявлен устаревшим в JDK 9.