Мягкие ссылки на Java

Мягкие ссылки на Java

1. обзор

В этой быстрой статье мы поговорим о программных ссылках в Java.

Мы объясним, что это такое, зачем они нам нужны и как их создавать.

2. Что такое мягкие ссылки?

Мягкий эталонный объект (или легко достижимый объект) может быть очищен сборщиком мусора в ответ на запрос памяти. A softly reachable object has no strong references pointing to it.

Когда вызывается сборщик мусора, он начинает перебирать все элементы в куче. GC хранит объекты ссылочного типа в специальной очереди.

После того, как все объекты в куче проверены, GC определяет, какие экземпляры следует удалить, удаляя объекты из этой очереди, упомянутой выше.

Эти правила различаются от одной реализации JVM к другой, но в документации указано, чтоall soft references to softly-reachable objects are guaranteed to be cleared before a JVM throws an OutOfMemoryError.

Тем не менее, нет никаких гарантий в отношении времени, когда мягкая ссылка очищается, или в порядке, в котором очищается набор таких ссылок на различные объекты.

Как правило, реализации JVM выбирают между очисткой недавно созданных или недавно использованных ссылок.

Объекты с легким доступом останутся живыми в течение некоторого времени после последнего обращения к ним. Значение по умолчанию - одна секунда жизни на свободный мегабайт в куче. Это значение можно настроить с помощью флага-XX:SoftRefLRUPolicyMSPerMB.

Например, чтобы изменить значение на 2,5 секунды (2500 миллисекунд), мы можем использовать:

-XX:SoftRefLRUPolicyMSPerMB=2500

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

Следовательно, они являются лучшим выбором, если нам нужно удерживать объекты в памяти как можно дольше.

3. Примеры использования мягких ссылок

Soft references can be used for implementing memory-sensitive caches, где управление памятью является очень важным фактором.

Пока референт мягкой ссылки надежно доступен, то есть фактически используется, ссылка не будет удалена.

Например, кеш может предотвратить сброс последних использованных записей, сохраняя строгие ссылки на эти записи, оставляя оставшиеся записи на усмотрение сборщика мусора.

4. Работа с мягкими ссылками

В Java мягкая ссылка представлена ​​классомjava.lang.ref.SoftReference.

У нас есть два варианта для его инициализации.

Первый способ - передать только референт:

StringBuilder builder = new StringBuilder();
SoftReference reference1 = new SoftReference<>(builder);

Второй вариант подразумевает передачу ссылки наjava.lang.ref.ReferenceQueue, а также ссылки на референт. Reference queues are designed for making us aware of actions performed by the Garbage Collector. Он добавляет объект ссылки в очередь ссылок, когда решает удалить референт этой ссылки.

Вот как инициализироватьSoftReference с помощьюReferenceQueue:

ReferenceQueue referenceQueue = new ReferenceQueue<>();
SoftReference reference2
 = new SoftReference<>(builder, referenceQueue);

Какjava.lang.ref.Reference, он содержит методыget иclear для получения и сброса референта соответственно:

StringBuilder builder1 = reference2.get();
reference2.clear();
StringBuilder builder2 = reference2.get(); // null

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

StringBuilder builder3 = reference2.get();
if (builder3 != null) {
    // GC hasn't removed the instance yet
} else {
    // GC has cleared the instance
}

5. Заключение

В этом уроке мы познакомились с концепцией мягких ссылок и их вариантами использования.

Кроме того, мы научились создавать его и работать с ним программно.