Почему фантомные ссылки не очищаются, поскольку они ставятся в очередь? - PullRequest
15 голосов
/ 13 августа 2011

Мы можем видеть, что «фантомная достижимость» так же недоступна, как и «недоступная»: §

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

Наконец, объект недоступен и, следовательно, имеет право на восстановление, когда это не так.достижимы любым из вышеперечисленных способов.

Теперь из: http://download.oracle.com/javase/6/docs/api/java/lang/ref/PhantomReference.html

В отличие от мягких и слабых ссылок, фантомные ссылки не очищаются автоматическисборщик мусора как они поставлены в очередь.Объект, достижимый с помощью фантомных ссылок, будет оставаться таким до тех пор, пока все такие ссылки не будут очищены или сами по себе не станут недоступными.

Что является основным обоснованием?Есть ли хотя бы один?

Это еще один типичный случай причуда Java API?

Ответы [ 2 ]

7 голосов
/ 13 августа 2011

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

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

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

Это объясняется здесь ,

Объект является фантомно достижимым, если он не является ни сильно, ни мягко, ни слабо достижимым, он был завершен, и некоторая фантомная ссылка ссылается на него.

Наконец, объект недоступен и, следовательно, имеет право на восстановление, если он не доступен ни одним из вышеперечисленных способов.

4 голосов
/ 18 июня 2018

Это было изменено в JDK 9. Теперь фантомные ссылки очищаются, как слабые и слабые ссылки. И соответствующий абзац был удален из Javadoc .

В отличие от мягких и слабых ссылок, фантомные ссылки не являются автоматически очищается сборщиком мусора при постановке в очередь. Объект, который доступен через фантомные ссылки, останется таким пока все такие ссылки не очищаются или сами становятся недостижим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...