Основной вопрос в теме, но позвольте мне показать свое видение процесса финализации в Java, чтобы я мог спросить вас немного больше.
Что ж, сборщик мусора запускает сборку мусора, помечая все живые объекты. Когда все достижимые объекты отмечены как «живые». Все остальные объекты недоступны. Следующим шагом будет проверка каждого недостижимого объекта и определение, можно ли его зачистить прямо сейчас или его нужно сначала доработать. GC думает следующим образом: если у метода finalize объекта есть тело, то этот объект подлежит финализации и должен быть финализирован; если метод finalize объекта имеет пустое тело (protected void finalize(){ }), то он не является финализируемым и может быть очищен сборщиком мусора прямо сейчас. (Прав ли я в этом?)
Все финализируемые объекты будут помещены в одну очередь для финализации позже один за другим. Насколько я понимаю, финализируемый объект может потратить много времени на помещение в очередь, ожидая своей очереди на финализацию. Это может произойти из-за того, что обычно только один поток с именем Finalizer берет объекты из очереди и вызывает их метод finalize, а когда у нас есть некоторые трудоемкие операции в методе finalize какого-либо объекта, другие объекты в очереди будут ждать завершения довольно долго. Ну, когда объект был завершен, он помечается как FINALIZED и удаляется из очереди. Во время следующего процесса сборки мусора сборщик увидит, что этот объект недоступен (снова) и имеет непустой метод финализации (снова), поэтому этот объект должен быть помещен в очередь (снова), но он выиграл а не потому, что сборщик каким-то образом видит, что этот объект был помечен как ЗАВЕРШЕННЫЙ. (Это мой главный вопрос: каким образом этот объект был отмечен как ЗАВЕРШЕННЫЙ, откуда сборщик знает, что этот объект не должен снова доработать?)