Рубрики
Без рубрики

Мягкие ссылки в Java

Узнайте о мягких ссылках в Java и о том, как их можно использовать.

Автор оригинала: baeldung.

1. Обзор

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

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

2. Что Такое Мягкие Ссылки?

Объект softreference (или мягко достижимый объект) может быть очищен сборщиком мусора в ответ на требование памяти. Мягко достижимый объект не имеет сильных ссылок, указывающих на него .

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

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

Эти правила варьируются от одной реализации JVM к другой, но в документации говорится, что все мягкие ссылки на объекты, доступные для мягкого доступа, гарантированно будут очищены до того, как JVM выдаст OutOfMemoryError.

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

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

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

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

-XX:SoftRefLRUPolicyMSPerMB=2500

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

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

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

Мягкие ссылки могут использоваться для реализации чувствительных к памяти кэшей , где управление памятью является очень важным фактором.

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

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

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

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

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

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

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

Второй вариант подразумевает передачу ссылки на java.lang.ref.ReferenceQueue , а также ссылки на ссылку. Очереди ссылок предназначены для информирования нас о действиях, выполняемых сборщиком мусора. Он добавляет ссылочный объект в очередь ссылок, когда решает удалить ссылку на эту ссылку.

Вот как инициализировать 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

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

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

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

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

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