Главный вопрос в теме, но позвольте мне показать мое видение завершения процесса разработки на Java, чтобы я мог попросить вас немного больше.Как объект помечен как завершенный на Java (так что метод finalize не будет вызываться во второй раз)?
Ну, gc начинает сбор мусора, отмечая все живые объекты. Когда все доступные объекты отмечены как «живые». Все остальные объекты недоступны. Следующий шаг - проверить каждый недостижимый объект и определить, можно ли его очистить прямо сейчас, или он должен быть окончательно доработан. gc думает, что следующий путь, если метод finalize объекта имеет тело, то этот объект финализируется и должен быть финализирован; если метод finalize объекта имеет пустое тело (protected void finalize() {}), то он не является окончательным и может быть подметен gc прямо сейчас. (Я прав?)
Все завершаемые объекты будут помещены в ту же очередь, которая будет завершена позже один за другим. Насколько я понимаю, финализируемый объект может потратить много времени на размещение в очереди, ожидая завершения его очереди. Это может произойти из-за того, что обычно только один поток, называемый Finalizer, принимает объекты из очереди и вызывает их метод finalize, и когда у нас есть некоторые трудоемкие операции в методе финализации некоторого объекта, остальные объекты в очереди будут ждать довольно долго, чтобы их можно было доработать. Ну, когда объект был завершен, он помечается как FINALIZED и удаляется из очереди. Во время следующего процесса сбора мусора коллекционер увидит, что этот объект недоступен (снова) и имеет непустой метод финализации (снова), поэтому этот объект должен быть помещен в очередь (снова), но это не произойдет, потому что коллекционер каким-то образом видит, что этот объект был отмечен как FINALIZED. (Это мой главный вопрос: каким образом этот объект был отмечен как FINALIZED, как коллекционер знает, что этот объект не должен быть финализирован снова?)
Спасибо. Это именно то, что я искал. Я исследовал эти классы Finalizer и FinalReference, и теперь я ясно понимаю, как это работает –