Вы ошиблись.
Краткий ответ: finalize()
- это средство очистки ресурсов (таких как открытые файлы) непосредственно перед тем, как объект будет готов для сборки мусора (когда ни один объект не имеет сильной ссылки на него). Это может / не называться. Это на шаг впереди процесса освобождения памяти.
Длинный ответ:
Существует отдельный поток демона, называемый потоком финализатора, который отвечает за вызов метода finalize (). Очередь финализации - это очередь, в которую помещаются объекты, готовые к вызову методом finalize ().
- При создании объекта JVM проверяет, не переопределил ли пользователь метод finalize (). Если это так, то он внутренне отмечает, что этот конкретный объект имеет метод finalize ().
Когда объект готов к сборке мусора, поток сборщика мусора проверяет, есть ли у этого конкретного объекта finalize () из таблицы, упомянутой в (1).
2a) Если этого не произошло, он отправляется на сборку мусора.
2b) Имеется, затем добавляется в очередь финализации. И удаляет запись объекта из таблицы (1).
Поток финализатора продолжает опрашивать очередь. Для каждого объекта в очереди вызывается его метод finalize (). После вызова finalize () цикл из (2) снова повторяется. Если этот объект по-прежнему не имеет сильной ссылки, отправляется в сборку мусора. Если это так, то ВСЕГДА вызывается (2a), потому что запись была удалена в (2b)
Basically finalize() method is only called once.
Так в чем же проблема с вышеуказанным циклом?
От 1). При создании объекта требуется дополнительное время. Выделение памяти в Java в 5-10 раз быстрее, чем у malloc / calloc и т. Д. Все выигранное время теряется на процедуру регистрации объекта в таблице и т. Д. Однажды я попробовал. Создайте 100000 объектов в цикле и измерьте время, необходимое для завершения программы в двух случаях: один без finalize (), второй с finalize (). Оказалось, что это на 20% быстрее.
Из (2b): Утечка памяти и голод. Если объект в очереди имеет ссылки на множество ресурсов памяти, то все эти объекты не будут освобождены, если этот объект не готов для сборки мусора. Если все объекты являются объектами с большим весом, то может быть нехватка.
Из (2b): Поскольку finalize () вызывается только один раз, что, если в finalize () у вас есть сильная ссылка на «этот» объект. В следующий раз, когда объект finalie () никогда не будет вызван, он может оставить объект в несогласованном состоянии.
Если внутри finalize () возникает исключение, оно игнорируется.
Вы не знаете, когда вызывается finalize (), поскольку вы не контролируете, когда вызывается сборщик мусора. Иногда может случиться так, что вы печатаете значение в finalize (), но вывод никогда не отображается, потому что ваша программа могла быть завершена к моменту вызова finalize ().
Следовательно, избегайте его использования. Вместо этого создайте метод say dispose (), который закроет необходимые ресурсы или для финального журнала и т. Д.
person
Jatin
schedule
29.08.2013