Я читаю о GC и читаю, что, когда объект получает право на сборку мусора, GC должен запустить на нем метод finalize
.Метод finalize
гарантированно выполняется только один раз, поэтому ГХ помечает объект как завершенный и дает ему отдых до следующего цикла.
В методе финализации вы можете технически «воскресить» объект,например, присваивая его статическому полю.Объект снова станет живым и не будет иметь права на сборку мусора, поэтому GC не будет собирать его во время следующего цикла.
Объект, однако, будет помечен как завершенный, поэтому, когда он снова станет подходящим,метод финализации не будет вызван.По сути, вы можете повернуть этот трюк «воскрешения» только один раз за время существования объекта.
Я нахожу это захватывающим.Однако, если моя переменная не является статической, как я могу изменить ее на статическую в методе finalize
?
Помните:
Объект получает право на сборку мусора или сборщик мусора, если оннедоступен из любых живых потоков или статических ссылок.Так что взломать это добавить объект к статическому ресурсу внутри метода finalize
, и это предотвратит сборку мусора только один раз.Метод finalize
защищен, поэтому может быть переопределен подклассами, независимо от того, находятся они в одном пакете или нет.
Это опасная практика, и нет необходимости использовать внутри кода приложения.