2013-10-09 4 views
2

Метод Java finalize вызывается после того, как JVM определяет, что объект имеет право на сбор мусора. Нет никаких реальных гарантий относительно того, когда это произойдет, или если это произойдет вообще до выхода программы. Мой вопрос: finalize is гарантированно вызывается для объектов, которые на самом деле собираются с мусором. Я специально думаю об объектах в младшем поколении GC поколения.Как финализаторы взаимодействуют с GC поколения?

В генерации GC, самое молодое поколение часто будет GC'd, используя простую коллекцию меток, в которую перемещаются только живые объекты и копируются в новое пространство. Таким образом, мусор в самом младшем поколении фактически не пересекается. И если мусор не пройден, то как мы гарантируем, что finalize вызывается для объектов, которые становятся мусором? Кажется, что либо a) нет никакой гарантии, что finalize будет вызван для этих объектов, которые становятся мусором в младшем поколении, или b) есть гарантия, что будет вызван finalize, но объекты, которые переопределяют finalize, каким-то образом обрабатываются по-разному.

+0

Смотрите этот ответ: http://stackoverflow.com/questions/7880569/does-jvm-gc-call-finalize-on- program-thread-exit – wheaties

ответ

1

Мой вопрос заключается в том, будет ли завершаться окончательный вариант для объектов, которые на самом деле собираются с мусором.

На практике да.

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

И если мусор не пройден, то как мы гарантируем, что финализация вызвана для объектов, которые становятся мусором?

Метод завершения не вызывается во время обхода (маркировки). Он называется позже на объектах, которые не получают отмеченные в фазе метки. Любой объект, который был отмечен в фазе метки, доступен ... и не является кандидатом на рекультивацию.


Вопрос в том, как же JVM знать, какие объекты не получил отмеченные? Казалось бы, это требует обхода всех объектов в детской, даже тех, которые являются мусором.

Это был бы один из способов сделать это.

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

И могут быть и другие схемы.

Если вы действительно хотите знать, как это делается, источник коллектора мусора свободно доступен.

+0

Вопрос в том, как JVM знает, какие объекты не были отмечены?Казалось бы, это требует обхода всех объектов в детской, даже тех, которые являются мусором. – pchiusano

+0

Нет, нужно только пройти специальный «список» объектов «finalizable», чтобы увидеть, отмечены ли они. –

+0

@ BjörnAntonsson - Думаю, я просто так сказал. См. Выше :-) –

Смежные вопросы