Почему Призрачные Ссылки не очищаются, поскольку они ставятся в очередь?
Мы видим, что "достижимый фантом" так же недоступен, как и "недоступный":
Объект является фантомно достижимым, если он не является ни сильно, ни мягко, ни слабо достижимым, он завершен, и некоторая фантомная ссылка ссылается на него.
Наконец, объект недоступен и, следовательно, имеет право на восстановление, если он не доступен ни одним из вышеперечисленных способов.
Теперь от: http://download.oracle.com/javase/6/docs/api/java/lang/ref/PhantomReference.html
В отличие от мягких и слабых ссылок, фантомные ссылки не очищаются сборщиком мусора автоматически, поскольку они ставятся в очередь. Объект, доступный через фантомные ссылки, будет оставаться таким до тех пор, пока все такие ссылки не будут очищены или сами по себе не станут недоступными.
Что является основным обоснованием? Есть ли хоть один?
Это еще один типичный случай Java API?
2 ответа
Мягкие ссылки очищаются при постановке в очередь, потому что основное использование мягких ссылок состоит в том, чтобы разрешить кэширование больших объектов, а очистка мягких ссылок позволяет собирать мусор для большого кэшированного объекта.
Слабые ссылки очищаются при постановке в очередь, потому что основное использование слабых ссылок состоит в том, чтобы позволить ссылаться на объект, не предотвращая его сборку мусора, поэтому очистка ссылок, как только объект помещается в очередь, позволяет объекту собираться мусором.
Фантомные ссылки не очищаются при постановке в очередь, поскольку один из вариантов использования фантомных ссылок - разрешить выполнение очистки перед сборкой мусора. Не сбрасывая ссылки, объект остается фантомно достижимым (и не пригодным для сбора мусора) до тех пор, пока пользователь не очистит PhantomReference от этого объекта или пока PhantomReference сам не будет очищен сборщиком мусора.
Это объясняется здесь,
Объект является фантомно достижимым, если он не является ни сильно, ни мягко, ни слабо достижимым, он завершен, и некоторая фантомная ссылка ссылается на него.
Наконец, объект недоступен и, следовательно, имеет право на восстановление, если он не доступен ни одним из вышеперечисленных способов.
Это было изменено в JDK 9. Теперь фантомные ссылки очищаются, как слабые и слабые ссылки. И соответствующий абзац был удален из Javadoc.
В отличие от мягких и слабых ссылок, фантомные ссылки не очищаются сборщиком мусора автоматически, поскольку они ставятся в очередь.Объект, доступный через фантомные ссылки, будет оставаться таким до тех пор, пока все такие ссылки не будут очищены или сами по себе не станут недоступными.