JavaRush /جاوا بلاگ /Random-UR /Отличия между слабыми, мягкими, фантомными и обычными ссы...
theGrass
سطح
Саратов

Отличия между слабыми, мягкими, фантомными и обычными ссылками в Java

گروپ میں شائع ہوا۔
«Слабые» ссылки и «мягкие» ссылки (WeakReference, SoftReference) были добавлены в Java API давно, но не каждый программист знаком с ними. Это свидетельствует о пробеле в понимании где и How их использовать. Ссылочные классы особенно важны в контексте сборки мусора . Как все мы знаем сборщик мусора сам освобождает память занимаемую an objectми, но не все программисты знают что решение об освобождении памяти он принимает исходя из типа имеющихся на an object ссылок. Отличия между слабыми, мягкими, фантомными и обычными linkми в Java - 1Главное отличие SoftReference от WeakReference в том How сборщик с ними будет работать. Он может удалить an object в любой момент если на него указывают только weak ссылки, с другой стороны an objectы с soft ссылкой будут собраны только когда JVM очень нужна память. Благодаря таким особенностям ссылочных классов каждый из них имеет свое применение. SoftReference можно использовать для реализации кэшей и когда JVM понадобится память она освободит ее за счет удаления таких an objectов. А WeakReference отлично подойдут для хранения метаданных, например для хранения ссылки на ClassLoader. Если нет классов для загрузки то нет смысла хранить ссылку на ClassLoader, слабая link делает ClassLoader доступным для удаления How только мы назначим ее instead of крепкой ссылки (Strong reference). В этой статье мы рассмотрим отличия типов ссылок в том числе Strong reference и Phantom reference (фантомная link).

WeakReference vs SoftReference в Java

Для тех кто не знает есть 4 вида ссылок:
  1. Strong reference
  2. Weak Reference
  3. Soft Reference
  4. Phantom Reference
Strong link самая простая, так How мы используем ее в программировании изо дня в день, например в codeе вида String s = “abc” переменная s это и есть strong link. Любой an object что имеет strong ссылку запрещен для удаления сборщиком мусора. Разумеется что это an objectы которые нужны Java программе. Слабые ссылки представлены классом java.lang.ref.WeakReference, вы можете определить слабую ссылку так:

Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Теперь, How только вы присвоor strong ссылке counter meaning null (counter = null), тот an object что создан в первой строке становится доступным для удаления сборщиком мусора, потому что он больше не имеет strong ссылки. Cозданная Weak link weakCounter не может предотвратить удаление сборщиком an object Counter. С другой стороны если бы это была Soft link, an object типа Counter не был бы удален до тех пор пока JVM не нуждалась бы в памяти особенно сильно. Soft ссылки в Java представлены классом java.lang.ref.SoftReference. Пример создания SoftReference в Java

Counter prime = new Counter();  // prime holds a strong reference 
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
После обнуления strong ссылки (в 3-ей строке) на an object Counter останется только 1 мягкая link которая не сможет предотвратить удаление этого an object сборщиком мусора, но в отличие от weak ссылки сможет отложить этот процесс до тех пор пока не появится острая нехватка памяти. Учитывая это отличие soft ссылки от weak, первая больше подходит для кэшей, а weak для метаданных. Хорошим примером служит класс WeakHashMap который является наследником интерфейса Map How и классы HashMap or TreeMap, но с одной отличительной особенностью. WeakHashMap оборачивает ключи How weak ссылки, что означает что How только не осталось strong ссылок на an object, weak ссылки которые расположены внутри WeakHashMap не спасут от сборщика мусора. Фантомные ссылки - третий тип ссылок, доступных в пакете java.lang.ref. Phantom ссылки представлены классом java.lang.ref.PhantomReference. Объект на который указывают только phantom ссылки может быть удален сборщиком в любой момент. Phantom link создается точно так же How weak or soft.

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Как только вы обнулите strong ссылки на an object DigitalCounter, сборщик мусора удалит его в любой момент, так How теперь на него ведут только phantom ссылки. Кроме классов WeakReference, SoftReference, PhantomReference, WeakHashMap, полезно знать о классе ReferenceQueue. Вы можете воспользоваться этим классом при создании an object класса WeakReference, SoftReference or PhantomReference:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Ссылка на an object будет добавлена в ReferenceQueue и вы сможете контролировать состояние ссылок путем опроса ReferenceQueue. Жизненный цикл Object хорошо представлен на этой диаграмме: Отличия между слабыми, мягкими, фантомными и обычными linkми в Java - 2Вот и все отличия между weak и soft linkми в Java. Так же мы познакомorсь с phantom linkми, классом WeakHashMap и ReferenceQueue. Правильное использование ссылок поможет при сборке мусора и в результате мы получим более гибкое управление памятью в Java. Оригинал статьи
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION