Сборщик мусора и метод finalize () - PullRequest
1 голос
/ 04 февраля 2010

Вы, люди, можете подумать, что в течение 15-20 минут я задал 4-5 вопросов по той же теме, поэтому мне может понадобиться учебник по этому вопросу. Но я получаю эти вопросы, читая о GC.

Таким образом, мой вопрос заключается в том, что GC вызовет метод finalize () для экземпляра только один раз в течение его жизненного цикла, даже если тот же объект будет лишен возможности собирать мусор в своем методе finalize (). Итак, я хотел знать, как GC узнает, что он выполнил свой метод finalize () один раз перед тем, как собирать его во второй раз

Ответы [ 3 ]

4 голосов
/ 04 февраля 2010

Честно говоря, ваша жизнь станет намного лучше, если вы забудете о существовании финализаторов. Я программировал Java годами, и у меня никогда не было причин использовать финализатор.

Они медленные, плохо определены (иногда они никогда не бегут!) И, как правило, PITA.

Вместо этого сделайте что-нибудь в духе интерфейса Closeable, если вы управляете внешними ресурсами, и для очистки используйте блоки try {} finally {}. В противном случае, старайтесь изо всех сил доверять языку, чтобы очистить память после себя.

1 голос
/ 04 февраля 2010

Зависит от реализации. Предположительно, виртуальная машина либо имеет секретный бит на каждом объекте, либо имеет таблицу, содержащую объекты, которые уже были «завершены». Если бы мне пришлось угадывать, я бы сказал, что последнее, поскольку предположительно набор уже завершенных объектов, которые все еще находятся вокруг, как ожидается, будет небольшим, поэтому иметь немного для каждого объекта в системе кажется немного расточительным.

0 голосов
/ 04 февраля 2010

А, ты опять:)

Обратите внимание, что в отношении финализаторов, если вы действительно FORCE GC, используя ForceGargabeCollection JVMTI, конкретно указано, что:

"Эта функция не запускает финализаторы."

Еще раз, вы, вероятно, на самом деле не хотите этого делать, но затем, если у вас есть 2K + повтор и 5 вопросов о GC, подумайте, что интересно повторять, что с помощью ForceGarbageCollection JVMTI вы действительно можете FORCE GC.

Достоверная информация о том, как заставить GC: * ​​1015 *

http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection

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