Сильная ссылка Java, мягкая ссылка, слабая ссылка, фантомная ссылка, сводка очереди ссылок
- В java, кроме переменных примитивных типов данных, все остальное — ссылочный тип.
- Ссылки делятся на сильные ссылки, мягкие ссылки, слабые ссылки и фантомные ссылки, которые влияют на восстановление объектов.
сильная цитата
- Сильная ссылка: в форме Object object = new Object(); Это типичная сильная ссылка. Объект, на который ссылается сильная ссылка, не будет активно утилизироваться сборщиком мусора. JVM скорее выдаст ошибку времени выполнения OutOfMemoryError (OOM ) для аварийного завершения программы, а также не решает проблемы с нехваткой памяти путем произвольного восстановления «живых» объектов с сильными ссылками. Для обычного объекта, если нет другого ссылочного отношения, если оно превышает область действия ссылки или явно присваивает соответствующей строгой ссылке значение null, ссылочный объект может быть повторно использован сборщиком мусора (конкретное время переработки по-прежнему равно см. политику сбора мусора).
Ссылка (эталонный класс)
- Позвольте мне сначала рассказать об этом.SoftReference, WeakReference и PhantomReference являются подклассами java.lang.ref.Reference.Этот класс Reference в основном имеет 4 метода.
- void clean(); очищает этот ссылочный объект. (Этот метод вызывается только кодом Java; когда сборщик мусора очищает ссылку, он выполняется напрямую, без вызова этого метода.)
- boolean enqueue(); Добавляет этот ссылочный объект в свою зарегистрированную очередь (если есть).
- T get(); возвращает указание на этот объект, на который ссылаются. (Этот метод может возвращать объект, на который ссылается Reference, который можно снова превратить в сильную ссылку) Например: объект, на который ссылается мягкая ссылка
MyObject aRef = new MyObject();
SoftReference aSoftRef=new SoftReference(aRef);
aRef = null;
//现在只有一个软引用指向MyObject的这个对象,
//如果这个对象还没有被回收,可以把他再次变为强引用
if(aSoftRef.get() != null)
MyObject bRef = aSoftRef.get();
//这个时候MyObject这个对象又变成强引用
-
boolean isEnqueued(); Сообщите программе или сборщику мусора, был ли объект-ссылка поставлен в очередь;
-
Два метода enqueue и isEnqueued используют ссылочные очереди, о которых мы поговорим позже. Я не буду объяснять это здесь, просто оставьте впечатление.
Мягкая ссылка
-
Мягкие ссылки реализованы через класс SoftReference. Мягкие ссылки имеют более короткое время жизни, чем сильные ссылки. Только когда JVM считает, что памяти недостаточно, она попытается восстановить объект, на который указывает мягкая ссылка: то есть JVM гарантирует, что объект, на который указывает мягкая ссылка, очищен до того, как будет выброшен OutOfMemoryError. Мягкая ссылка может использоваться в сочетании с очередью ссылок (ReferenceQueue).Если объект, на который ссылается мягкая ссылка, утилизируется сборщиком мусора, виртуальная машина Java примет мягкую ссылку (обратите внимание, что она ссылается на сам объект ( то есть сама ссылка, а не ссылка. Объект, на который ссылаются, добавляется в очередь ссылок, связанную с ним. Позже мы можем вызвать метод poll() для ReferenceQueue, чтобы проверить, переработаны ли какие-либо объекты, о которых он заботится ( потому что все объекты, на которые указывают ссылки в этой очереди, перерабатываются. Если очередь пуста, она вернет null, в противном случае метод возвращает объект Reference перед очередью.
-
Сценарий приложения. Мягкие ссылки часто используются для реализации кэшей, чувствительных к памяти. Если еще есть свободная память, вы можете временно сохранить кеш и очистить его, когда памяти будет недостаточно, чтобы гарантировать, что кеш не будет исчерпан при использовании кеша.
Слабая ссылка (WeakReference)
-
Слабые ссылки реализуются через класс WeakReference. Слабые ссылки имеют более короткое время жизни, чем мягкие ссылки. В процессе сканирования области памяти, находящейся под юрисдикцией потока сборщика мусора, при обнаружении объекта со слабой ссылкой его память будет освобождена независимо от того, достаточно ли текущего места в памяти или нет. Поскольку сборщик мусора является потоком с очень низким приоритетом, объекты со слабыми ссылками не обязательно будут быстро утилизированы. Слабые ссылки можно использовать в сочетании с очередью ссылок (ReferenceQueue).Если объект, на который ссылается слабая ссылка, подвергается сборке мусора, виртуальная машина Java добавит слабую ссылку в связанную с ней очередь ссылок (используется с очередью ссылок как выше).мягкие ссылки).
-
Сценарий приложений: Слабые приложения также могут быть использованы для чувствительного к памяти кэширования.
PhantomReference
-
Фантомные ссылки также называются виртуальными ссылками и реализуются через класс PhantomReference. Никакое свойство или функция объекта не могут быть доступны через виртуальную ссылку. Фантомные ссылки просто обеспечивают механизм, гарантирующий, что что-то будет сделано после финализации объекта. Если объект содержит только фантомные ссылки, он может быть собран сборщиком мусора в любое время, как если бы у него вообще не было ссылок. Виртуальная ссылка должна использоваться вместе с очередью ссылок (ReferenceQueue). Когда сборщик мусора готов освободить объект, если он обнаружит, что у него все еще есть виртуальная ссылка, он добавит виртуальную ссылку в связанную с ним очередь ссылок перед освобождением памяти объекта. Программа может узнать, будет ли объект, на который делается ссылка, сборщиком мусора, определив, добавлена ли виртуальная ссылка в очередь ссылок. Если программа обнаружит, что в очередь ссылок была добавлена виртуальная ссылка, она может предпринять некоторые программные действия, прежде чем память объекта, на который указывает ссылка, будет освобождена (используется с очередями ссылок, как описано выше, для мягких и слабых ссылок).
-
Сценарий приложения: его можно использовать для отслеживания активности объектов, утилизированных сборщиком мусора.Когда сборщик мусора убирает объект, связанный с виртуальной ссылкой, будет получено системное уведомление.
Эталонная очередь (ReferenceQueue)
- Объект Reference больше не имеет ценности существования, и необходим соответствующий механизм очистки, чтобы избежать утечек памяти, вызванных большим количеством объектов SoftReference. ReferenceQueue также предоставляется в пакете java.lang.ref.
- Как упоминалось ранее, при использовании мягких ссылок, виртуальных ссылок и фантомных ссылок может быть указана очередь ссылок.После того, как объект, на который ссылается ссылка, будет переработан, сама ссылка попадет в очередь ссылок.
- Пример использования следующий
ReferenceQueue queue = new ReferenceQueue();
SoftReference ref=new SoftReference(aMyObject,queue);
- Через очередь ссылок вы можете увидеть, какие объекты, на которые ссылаются объекты Reference, были переработаны.При вызове метода poll() очереди ссылок вы можете вернуть объекты Reference в очереди, которые потеряли объекты, на которые ссылаются.
- Используя этот метод, мы можем проверить, какие объекты с мягкой ссылкой SoftReference были восстановлены. Таким образом, мы можем очистить эти объекты SoftReference, которые теряют объекты, на которые ссылаются мягкие ссылки.
SoftReference ref = null;
while ((ref = (EmployeeRef) q.poll()) != null) {
// 清除ref
}
некоторые приложения
- Мягкие ссылки и слабые ссылки могут быть использованы для некоторых чувствительных к памяти кешей.Когда места достаточно, объекты кешируются, а когда их недостаточно, они восстанавливаются без выбрасывания оме (исключение переполнения памяти, таких маленьких демок много в интернете, а я здесь не буду вдаваться в подробности)
- Ключ входа - слабая ссылка.Из его конструктора видно, почему это слабая ссылка, потому что, когда объект threadlocal не используется, он устанавливается в ноль, но в это время ключ входа все еще указывает к объекту threadlocal.Если на этот раз сильная ссылка приведет к невозможности повторного использования объекта threadlocal и вызовет утечку памяти, поэтому, если он будет изменен на слабую ссылку, когда есть только одна запись со слабой ссылкой, ключ которой указывает на threadlocal объект Threadlocal будет переработан во время сборки мусора. (Это включает в себя некоторые базовые реализации ThreadLocal, вы можете прочитать мой блог (nuggets.capable/post/684490…
При введении сильных цитирований, мягких цитирований, слабых цитирований и фантомных цитирований я процитировал некоторые комментарии в других блогах.Поскольку публиковать ссылки непросто, я могу только заявить об этом.