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