Важность фантомной ссылки в Java

Я хотел понять заявление ниже, выделенное жирным шрифтом. Что это значит? ( Ссылка)

Объект, который переопределяет finalize() Теперь необходимо определить, что это мусор, по крайней мере, в двух отдельных циклах сбора мусора, чтобы его можно было собирать. Когда первый цикл определяет, что это мусор, он становится пригодным для завершения. Из-за (тонкой, но, к сожалению, реальной) возможности того, что объект был "воскрешен" во время финализации, сборщик мусора должен запустить снова, прежде чем объект может быть фактически удален. И поскольку завершение могло не произойти своевременно, произвольное количество циклов сборки мусора могло произойти, пока объект ожидал завершения. Это может означать серьезные задержки на самом деле очистки объектов мусора, и именно поэтому вы можете получить OutOfMemoryError даже когда большая часть кучи - мусор.

Что решает фантомная ссылка

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

Пожалуйста, помогите мне понять проблему и решение

Спасибо

1 ответ

Решение

Вопреки распространенному мнению, finalize методы не запускаются, когда связанные с ними объекты собирают мусор, а скорее, когда связанные с ними объекты собирались бы мусором, но для существования их не по умолчанию finalize методы. Объекты на самом деле нельзя собирать мусором до тех пор, пока система не будет на 100% уверена, что ссылки на них никогда не будут существовать, но процесс запуска finalize Метод создает сильную корневую ссылку на рассматриваемый объект, которая будет существовать, по крайней мере, до выхода из метода. Если во время исполнения finalize ссылка на объект сохраняется в другом месте, эта ссылка может продолжать существовать бесконечно. Следовательно, нет объекта, чей finalized метод будет вызываться, и любой другой объект, на который такой объект имеет прямую или косвенную сильную ссылку, не может быть собран до окончания finalize метод запущен, и следующий цикл GC подтверждает, что ссылка на объект больше не существует.

PhantomReference Класс служит для инкапсуляции другой парадигмы: вместо того, чтобы поддерживать живой объект, чтобы система могла уведомить его о том, что он был заброшен, и единственная причина, по которой он все еще жив, заключается в том, что он может получать уведомление об отказе, объекты, требующие очистки, должны создавать вспомогательные объекты для обработки уведомления их оставления. Если вспомогательные объекты избегают сохранять ссылки на любые внешние объекты, которые они не "владеют", их существование не будет мешать коллекции их родительского объекта или других объектов, на которые родители имеют прямые или косвенные ссылки. Вспомогательные объекты обычно не содержат достаточно информации, чтобы позволить им "делать много", но это хорошо, потому что им не нужно много делать. Вместо этого их дизайн должен быть направлен на выполнение очистки, которая потребуется, если их родитель будет оставлен.

Другие вопросы по тегам