Первый вопрос. Из одной статьи.
System.runFinalization() создает второй поток "SecondaryFinalizer", который также вызывает finalize() для объектов из той же очереди, при этом поток, вызвавший System.runFinalization() ждёт, пока не кончится очередь Finalizer, которая имеется на данный момент.
Я здесь не понял, он будет работать параллельно? Или же всё таки дождётся окончания первого потока и продолжит, но тогда какой толк от этого.
Второй вопрос. Цитата ниже уже из другой статьи.
Сборщик очистит финализированный объект за два шага: в первый выполниться finalize, а во второй соберется.
- Сборщик идёт гулять по памяти
- Останавливает все потоки
- Делает свои операции с объектами в зависимости от подхода. Встречает финализированный объект, выполняет код в теле finalize() и отправляет его в очередь Finalizer на удаление.
- Очищает память от мусора, не трогая очередь Finalizer.
- Возобнавляет работу приложения.
Второй проход.
Тоже самое, только на третьем пункте параллельно идёт поток Finalizer, очищая объекты из очереди.
Я правильно понял? Или Поток Finalizer работает вне зависимости от самого сборщика. И уже в первом проходе на пункте 4 поток Finalizer будет жить своей жизнью. И действует ли stop the world на поток Finalizer? И еще вопрос на пункте 3, код в теле finalize выполнится сразу перед помещением в очередь или уже в очереди перед удалением?
Большое спасибо!