3

По ссылке https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html, PhantomReferences является помещёны только тогда, когда объект физически удаляются из памяти и WeakReferences является помещён до завершения или сбор мусора фактически произошло.Понимание ссылки Фантом против слабой ссылки относительно Ссылки очереди

Разница заключается именно в том, когда происходит заражение. WeakReferences помещаются в очередь, как только объект, к которому они указывают , становится слабодоступным. Это до финализации или мусора. коллекция действительно произошла; теоретически объект может быть даже «воскрешен» методом неортодоксального finalize(), но значение WeakReference оставалось бы мертвым. PhantomReferences помещается в очередь только , когда объект физически удаляется из памяти, а метод get() всегда возвращает значение null специально, чтобы вы не могли «воскресить» почти мертвый объект.

, тогда как в соответствии с http://www.ibm.com/developerworks/library/j-refs/, PhantomReference добавляется к его ReferenceQueue до объекта кучного освобождается и и WeakReferences добавляют к его ReferenceQueue после финализации или сборке мусора.

В отличие от мягких и слабых ссылок, то PhantomReference добавляется к его ReferenceQueue до объекта куча освобождается. (Помните, что все Объекты PhantomReference должны быть созданы с ассоциированным ReferenceQueue.) Это позволяет предпринять действия перед тем, как объект кучи будет восстановлен.

Когда метод finalize() объекта кучи запущен и его память освобождена, объект WeakReference добавляется в свой ReferenceQueue, если он существует.

Я смущен. Какой из них правильный?

В основном, я хочу знать разницу между слабым и фантомным ссылкой относительно ссылочной очереди?

ответ

4

На ReferenceQueue:

Оба WeakReference и PhantomReference будет помещён после их референта (ссылка объекта) не сильно достижимым, если они имеют непустое референтной очереди на учете, когда они были созданы.

Перед тем, как оно передано для enqueuing, WeakReference очищает (сводит на нет) поле референта, чтобы сделать референт полностью недостижимым. Когда WeakReference очищается, приложение больше не может получить() референт. Это означает, что, когда позже WeakReference помещается в очередь, get() возвращает null. У WeakReference может быть не зарегистрированная ссылочная очередь, когда она была создана. Приложение может определить, недоступен ли его референт, get(). Иногда справочная очередь удобна для управления WeakReferences, когда приложение не хочет управлять ими явно.

Прежде чем он будет передан для enqueuing, PhantomReference не очистит поле референта. Когда он находится в очереди, референт по-прежнему ссылается на PhantomReference.Референт очищается только приложением явно после того, как он отбрасывает ссылочную очередь. Если приложение не очистит его, референт останется там, пока оба его и его PhantomReference не будут восстановлены вместе. В любом случае get() на PhantomReference всегда возвращает null, даже если он не очищается. Таким образом, приложение не может определить, недоступен ли его референт, get(). Приложение может обнаружить это только путем проверки того, поставлена ​​ли очередь PhantomReference. По этой причине необходимо создать PhantomReference с зарегистрированной референсной очередью; В противном случае это бесполезно.

На доработку:

Когда WeakReference очищается, референт становится недоступным. Если референт имеет финализатор, отличный от нестандартного, он подвергается завершению, поэтому он должен быть воскрешен. Если референт не имеет финализатора, отличного от стандартного, он может быть исправлен GC. Другими словами, WeakReferences обрабатываются до завершения.

Если референт PhantomReference доступен только через PhantomReference, он еще не доступен для фантома. Он доступен только призрачно, если он остается таким (только достижимый через PhantomReference) после завершения. Другими словами, PhantomReferences обрабатываются после завершения. Только те референты, которые не воскресают в результате финализации, являются фантастически доступными, поэтому они обязательно умрут. Но с тех пор PhantomReference будет выставлен в очередь, эти референты еще не мертвы. Они становятся доступными только тогда, когда PhantomReferences будут удалены позже приложением, или PhantomReferences станут недоступными (тогда PhantomReference и его референт будут возвращены вместе.)

 Смежные вопросы

  • Нет связанных вопросов^_^