Что если финализатор сделает объект достижимым? - PullRequest
6 голосов
/ 28 сентября 2010

В Java finalize вызывается для объекта (который переопределяет его), когда он собирается собирать мусор, например, когда он недоступен. Но что, если финализатор снова сделает объект доступным, что произойдет?

Ответы [ 5 ]

10 голосов
/ 28 сентября 2010

Тогда объект не собирается мусором, в основном. Это называется воскресение объекта . Выполните поиск по этому термину, и вы должны получить кучу интересных статей. Как упоминал Джим, один важный момент заключается в том, что финализатор будет запущен только один раз.

9 голосов
/ 28 сентября 2010

Объект не будет собран, пока он снова не станет недоступным.

Согласно JavaDoc , finalize () больше не будет вызываться.

7 голосов
/ 28 сентября 2010

Если вы внимательно прочитаете описание API, вы увидите, что финализатор может сделать объект снова доступным. Объект не будет удален, пока он не будет недоступен (снова), но finalize() не будет вызываться более одного раза.

3 голосов
/ 28 сентября 2010

Это фактически делает еще один проход, чтобы проверить и убедиться, что больше нет ссылок на объект. Так как он провалит этот тест на втором проходе, вы не освободите память для объекта.

Поскольку finalize вызывается только один раз для любого данного объекта, в следующий раз, когда у него нет ссылок, он просто освободит память без вызова finalize. Немного полезной информации здесь о доработке.

3 голосов
/ 28 сентября 2010

Да, именно поэтому вы не используете финализаторы (ну, одна из многих причин).

Для этой цели создана справочная коллекция. Я посмотрю его и опубликую здесь через секунду, но я думаю, что это PhantomReference.

Да, PhantomReference :

Фантомные эталонные объекты, которые ставятся в очередь после того, как сборщик определит, что их референты могут быть возвращены в противном случае Фантомные ссылки чаще всего используются для более гибкого планирования предварительных действий по очистке, чем это возможно с механизмом финализации Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...