1. Справочный тип (за исключением сильной ссылки)
Можно понять, что прямой подкласс ссылок обрабатывается JVM, поэтому он не влияет на непосредственное унаследование ссылочного типа в коде. Его можно унаследовать только от подкласса. Соответствующие типы подкласса включают следующее. (Игнорируйте те, которые не используются на Java, такие как Jnireference)
Softreference
Слабая обратная сторона
FinalReference
PhantomReference
Приведенный выше ссылочный тип также упоминается в соответствующем Javadoc. FinalReference специально разработан для метода завершения, и есть несколько других конкретных сценариев применения. Среди них, Softreference используется в кэшах, связанных с памятью, SleedReference используется в большинстве сценариев, связанных с переработкой. PhantomReference используется в сценариях обратного вызова для переработки упаковочных объектов (например, обнаружение утечки ресурсов).
Вы можете напрямую просмотреть информацию о подклассе нескольких типов в IDE, чтобы понять, какие сценарии используются в большинстве структур, унаследовав соответствующие типы, чтобы мы могли фактически выполнять обработку выбора типа.
2. Справочный конструктор
Он предоставляет два конструктора внутри, один с очередью, а другой без очередей. Значение очереди заключается в том, что мы можем отслеживать эту очередь снаружи. То есть, если объект собирается переработать, соответствующий эталонный объект будет размещен в этой очереди. Когда мы получаем ссылку, мы можем сделать еще несколько транзакций.
Если вы этого не сделаете, вы можете только непрерывно обучать справочный объект и судить, возвращает ли Get Inside Null (объект PhantomReference не может этого сделать, Get всегда возвращает NULL, поэтому он имеет только конструктор с очередью). Оба метода имеют соответствующие сценарии использования, в зависимости от фактического применения. Например, в Sleedhashmap вы решите запросить данные очереди, чтобы определить, будет ли какой -либо объект переработан. Для Threadlocalmap он используется для определения того, является ли get () NULL для обработки.
Соответствующий конструктор выглядит следующим образом:
Ссылка (t referment) {this (referent, null);} ссылка (t reference, referencequeue <? Super t> queue) {this.Referent = референт; this.queue = (queue == null)? Reference Queue.null: queue;}Нулевая очередь здесь может быть понята как очередь, которая не требует какой -либо обработки данных в своей очереди. И он не будет доступа к каким -либо данным внутри него.
В приведенном выше объекте ссылка представляет объект, который он ссылается, то есть объект, который мы должны быть завернуты, когда мы его строим. Определение того, что объект должен быть переработан, означает, что этот объект не имеет другой ссылки, за исключением ссылки (не то, что на него на самом деле не ссылается, но доступность GCROOT не подлежит недоступности, чтобы избежать проблемы круговой ссылки).
Очередь - это очередь, которая должна быть уведомлена при переработке объекта. Когда объект переработан, весь эталонный объект (не переработанный объект) будет размещен в очереди, а затем внешние программы могут получить соответствующие данные, контролируя эту очередь.
3. referencequeue и эталонная цепочка
Очередь здесь - номинальная очередь, но внутри нет фактической структуры хранения. Его хранилище зависит от взаимосвязи между внутренними узлами. Можно понять, что очередь - это структура, аналогичная связанному списку, и узел здесь на самом деле является самой ссылкой. Можно понять, что очередь представляет собой контейнер для связанного списка, который хранит только текущий узел головного узела, а последующие узлы поддерживаются каждым эталонным узлом сами через следующее.
Значение эталонного статуса
Каждый эталонный объект имеет соответствующее описание состояния, то есть он описывает себя и обернутый объект в настоящее время, для удобства запросов, позиционирования или обработки.
1. Активное: активное состояние, то есть соответствующий объект является сильным эталонным состоянием и не было переработано. В этом состоянии объект не будет помещен в очередь. В этом состоянии следующее - NULL, а очередь - это очередь, упомянутая при ее определении.
2. В ожидании: приготовьтесь поместить его в очередь. В этом состоянии объекты, которые должны быть обработаны, будут в очереди один за другим в очередь. В течение этого временного окна соответствующие объекты находятся в ожидаемом состоянии. Независимо от того, какая ссылка, если вы введете это состояние, вы можете подумать, что в соответствующем состоянии сама по себе является (установлена JVM), а очередь - это очередь, ссылаясь на то, что она определена.
3. Enqueed: соответствующий объект уже должен быть переработан, и соответствующий эталонный объект был помещен в очередь. Внешний поток готов запросить очередь, чтобы получить соответствующие данные. В этом состоянии следующим является следующим объектом, который будет обработан, а очередь представляет собой специальную идентификационную объект.
4. Неактивно: то есть этот объект был извлечен из очереди извне и был обработан. Это означает, что этот эталонный объект может быть переработан, и внутренне инкапсулированный объект также может быть переработан (фактическая операция утилизации зависит от того, называется ли четкое действие). Можно понять, что те, кто входит в это состояние, должны быть переработаны.
JVM не нужно определять значение состояния, чтобы определить, в каком состоянии находится соответствующая ссылка. Он должен только рассчитывать дальше и очереди для вынесения суждений.
4. referencequeue#голова
Всегда сохраняйте последний узел, который будет обрабатываться в текущей очереди. Вы можете рассматривать очередь как последнюю очередь первого выхода. Когда вступает новый узел, принимается следующая логика.
newe.next = head; head = newe;
Затем при получении используйте соответствующую логику
tmp = head; head = tmp.next; return tmp;
V. Ссылка#Далее
То есть опишите следующий узел, хранящийся в соответствии с эталонным узлом, который должен быть обработан. Но следующий будет иметь смысл только при помещении в очередь. Чтобы описать соответствующее значение статуса после размещения в очередь, его очередь больше не будет ссылаться на очередь. Вместо этого это будет относиться к специальной экипировке. Поскольку он был помещен в очередь, он больше не будет помещен в очередь.
6. Ссылка#Референт
То есть опишите фактический объект, на который ссылаются текущая ссылка, который будет тщательно обрабатываться, как указано в аннотации. То есть, когда эта штука будет переработана, и если она будет переработана, она будет напрямую установлена на NULL, а внешние программы могут извлечь уроки из самого эталонного объекта (а не референта), что происходит поведение утилизации.
7. reference Queckue#enqueue ожидает справочную энкею
Этот процесс является процессом эталонного объекта от Active-> wenting-> enqued. Этот метод состоит в том, чтобы обработать объект, который обрабатывает ожидающее состояние как внедренное состояние. Соответствующий процесс - это предыдущая логика, то есть узел, и соответствующий код заключается в следующем.
r.queue = enqueud; r.next = (голова == null)? R: Head; Head = r; queuelghing ++; lock.notifyall ();
Последняя NITIFY означает уведомление внешней программы, которая блокирует текущую очередь ранее. (То есть ожидающий объект не был получен ранее)
8. Ссылка#tryhandlepending
То есть он обрабатывает изменение эталонного объекта с активного до ожидаемого состояния. Внутри эталонного объекта существует статическое поле, и его соответствующее объявление заключается в следующем:
/* Список ссылок, ожидающих, чтобы быть внедренными. Коллекционер добавляет * ссылки на этот список, в то время как поток-контроль-хенд удаляет * их. Этот список защищен вышеуказанным объектом блокировки. Список * использует обнаруженное поле, чтобы связать его элементы. */частная статическая ссылка <object> wanding = null;
Можно понимать, что JVM поставит объект для обработки на этом статическом поле при GC. В то же время, другое обнаруженное поле представляет следующий объект объекта, который будет обработан. То есть можно понять, что объект для обработки также является связанным списком. Это в очереди через Discovery. Вам нужно только продолжать находиться на рассмотрении, а затем постоянно получать следующий объект через обнаружение. Поскольку оба потока могут получить доступ к этому ожидающему объекту, необходимо использовать обработку блокировки.
Соответствующий процесс обработки выглядит следующим образом:
if (ожидание! = null) {r = ожидание; // «экземпляр» может отбросить OutofmemoryError Иногда // так же, как и до того, как не связывать «r» из «ожидающей» цепи ... c = r экземпляра чистка? (Очиститель) r: null; // unlink 'r' из «ожидающей» цепи в ожидании = R.discovered; r.discovered = null;} // Внедрение объекта обработки, то есть он входит в enqued wation referenceue <? Super Object> Q = R.QUEUE; if (Q!9. Ссылка#clear
Очистите исходный объект, на который ссылается ссылочный объект, чтобы исходный объект больше не мог быть доступен через метод get (). Из соответствующей идеи дизайна, поскольку она вошла в объект очереди, это означает, что соответствующий объект должен быть переработан, поскольку нет необходимости снова получить доступ к исходному объекту. Этот метод не будет вызван JVM, и JVM напрямую очищает соответствующую ссылку с помощью полевых операций, и его конкретная реализация согласуется с текущим методом.
Семантика ясного - это нулевая ссылка.
После того, как объект ShandeReference поступает в очередь, соответствующая ссылка является нулевой.
Объект Softreference, если объект не входит в очередь, когда память достаточно, соответствующая ссылка не будет нулевой. Если его необходимо обработать (недостаточно памяти или других политик), соответствующая ссылка установлена на NULL, а затем введите очередь.
Объект FinalReference, потому что он должен вызвать свой объект завершения, даже если его ссылка введена в очередь, его ссылка не будет нулевой, то есть он не будет очищен.
Объект PhantomReference, потому что сам Get, реализованный для возврата NULL, не очень полезен. Потому что это не будет очищено независимо от того, является ли это энкеуэ или нет.
10. Руководство по enqueue referencehandler
Как упомянуто выше, JVM установит объект, который будет обрабатываться в ожидающий объект, поэтому должен быть поток для выполнения непрерывных операций по внедрению. Этот поток относится к потоке процессора, а его приоритетом является MAX_PRIORITY, то есть самый высокий. Соответствующий процесс запуска создается статическая инициализация, которая может быть понята, как при использовании любого эталонного объекта или класса, этот поток будет создан и запущен. Соответствующий код следующим образом:
static {threadgroup tg = think.currentThread (). getThreadGroup (); for (threadgroup tgn = tg; tgn! = null; tg = tgn, tgn = tg.getParent ()); Think Handler = new ReferenceHandler (TG, "Справочный обработчик"); / * Если бы был специальный приоритет только для системы, превышающий * max_priority, он использовался бы здесь */ handler.setPriority (think.max_priority); handler.setdaemon (true); handler.start ();}Его приоритет - самый высокий, который можно понимать как необходимость непрерывно обрабатывать эталонные объекты. При печати работающего потока через JSTACK соответствующий обработчик ссылок относится к инициализированному здесь потоке, как показано ниже:
11. JVM связан
В каждой из вышеперечисленных точек обработки они связаны с процессом переработки JVM. То есть считается, что процесс GC будет работать в сочетании с соответствующей ссылкой. Например, используя коллекционер CMS, процесс предварительного тона участвует во всем, упомянутом выше процессе, а также обработку замечаний Softreference и т. Д. В то же время различная обработка эталонного объекта также должна быть связана с конкретным типом. Соответствующая обработка JVM использует код C ++, поэтому его необходимо тщательно разобраться.
12. Резюме
Как и объект FinalReference, вся эта ссылка и справочная Queckue представляют собой группу групп обработки, которые работают вместе. Чтобы обеспечить различную справочную семантику, процесс, связанный с JVM GC, наконец реализуется для различных сценариев и различных эталонных уровней.
Кроме того, потому что непосредственно использование rekerqueue и открывающих потоков для мониторинга очередей слишком хлопотно и сложнее. Вы можете обратиться к FinalizableReferenceueue, реализованным Google Guava и соответствующим объектом FinalizableReference. Процесс обработки может быть немного упрощен. Выше приведено все содержание этой статьи, и я надеюсь, что это принесет некоторую помощь для обучения или работы каждого.