Найти тему

SoftReference — котики, которые уходят при необходимости

SoftReference — это один из типов ссылок (всего их 4), который предназначен для более гибкого управления памятью. Эта ссылка позволяет котику объекту существовать до тех пор, пока на это есть память. Сборщик мусора его не тронет.

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

Как происходит решение об удалении SoftReference:

  1. Когда системе не хватает памяти, сборщик мусора начинает свою работу. Он ищет объекты, на которые нет жёстких ссылок (обычные) и которые могут быть удалены без вреда для корректной работы приложения.
  2. Если объекты находятся в SoftReference, они считаются более "удаляемыми" в сравнении с объектами, на которые есть только жёсткие ссылки. Если системе не хватает памяти, сборщик мусора сначала начнет удалять объекты, на которые ссылаются "мягкие" ссылки, чтобы освободить место.
  3. ReferenceQueue (https://docs.oracle.com/javase/8/docs/api/java/lang/ref/ReferenceQueue.html): в Java и Kotlin есть ReferenceQueue, которая позволяет отслеживать объекты, ссылки на которые были удалены сборщиком мусора. SoftReference можно использовать с ReferenceQueue, чтобы получить уведомление о том, когда объект был удален.

Зачем нужны SoftReference и когда их использовать?

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

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

Пример использования:

SoftReference — это один из типов ссылок (всего их 4), который предназначен для более гибкого управления памятью. Эта ссылка позволяет котику объекту существовать до тех пор, пока на это есть память.

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

Плюсы SoftReference:

  • Помогают предотвратить OutOfMemoryError, освобождая память при необходимости.
  • Подходят для реализации кэширования и хранения объектов, которые могут быть удалены при нехватке памяти.

Минусы:

  • Нет гарантии, что объекты в SoftReference будут сохранены в памяти всегда, даже если для этого есть место. Это зависит от стратегии управления памятью в JVM.
SoftReference — это один из типов ссылок (всего их 4), который предназначен для более гибкого управления памятью. Эта ссылка позволяет котику объекту существовать до тех пор, пока на это есть память.-2

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes

P.S. сделано с помощью https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/lang/ref/SoftReference.html, ChatGPT и Midjourney. :)