Почему, начиная с java 9 PhantomReference, в java doc говорится, что он предназначен для действий по очистке POST-mortem, хотя ранее он был PRE-mortem - PullRequest
0 голосов
/ 20 июня 2019

PhantomReference Java-документ для Java 8 и менее выглядит следующим образом:

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

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

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

PhantomReference java doc для java 9 и выше выглядит следующим образом:

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

Чтобы гарантировать, что восстанавливаемый объект остается таким, референт фантомной ссылки может небыть извлеченным: метод get ссылки фантома всегда возвращает ноль.

Что-то изменилось в поведении PhantomReference в java 9?или просто основатели Java переосмыслили посвящение этого класса?

1 Ответ

2 голосов
/ 21 июня 2019

Поскольку Java 9, PhantomReference (PR) автоматически очищается .То, что вы видите, - это изменение Javadoc, которое происходит в результате этого изменения.

До Java 9 объект, на который ссылается PR, оставался живым, даже если его get() возвращал null.Следовательно, до тех пор, пока сам пиар не будет мертв, референт будет технически жив, хотя вы не можете получить ссылку на него.Преимущества такого поведения не очень очевидны.В любом случае, обработка PR была бы «предубойной очисткой».

После Java 9 PR очищается прямо перед постановкой в ​​очередь (как и другие типы слабых / мягких ссылок), сам референт становится полностью мертвым перед PRобрабатывается кодом приложения, который будет являться «посмертной очисткой».

...