Метод Java finalize
вызывается после того, как JVM определяет, что объект имеет право на сбор мусора. Нет никаких реальных гарантий относительно того, когда это произойдет, или если это произойдет вообще до выхода программы. Мой вопрос: finalize
is гарантированно вызывается для объектов, которые на самом деле собираются с мусором. Я специально думаю об объектах в младшем поколении GC поколения.Как финализаторы взаимодействуют с GC поколения?
В генерации GC, самое молодое поколение часто будет GC'd, используя простую коллекцию меток, в которую перемещаются только живые объекты и копируются в новое пространство. Таким образом, мусор в самом младшем поколении фактически не пересекается. И если мусор не пройден, то как мы гарантируем, что finalize
вызывается для объектов, которые становятся мусором? Кажется, что либо a) нет никакой гарантии, что finalize
будет вызван для этих объектов, которые становятся мусором в младшем поколении, или b) есть гарантия, что будет вызван finalize
, но объекты, которые переопределяют finalize
, каким-то образом обрабатываются по-разному.
Смотрите этот ответ: http://stackoverflow.com/questions/7880569/does-jvm-gc-call-finalize-on- program-thread-exit – wheaties