Ответ
SoftReference (java.lang.ref.SoftReference) используется для реализации кешей в памяти, потому что она позволяет сборщику мусора (GC) гибко управлять их содержимым в условиях нехватки памяти.
Принцип работы:
- Объект, на который ссылается только
SoftReference, считается мягко достижимым. - GC гарантированно удалит все такие объекты перед выбросом
OutOfMemoryError. - Это делает
SoftReferenceидеальными для кеширования данных, которые можно пересоздать, но чье наличие в памяти улучшает производительность.
Пример использования для кеша:
public class ImageCache {
private SoftReference<Map<String, BufferedImage>> cacheRef;
public BufferedImage getImage(String path) {
Map<String, BufferedImage> cache = (cacheRef != null) ? cacheRef.get() : null;
if (cache == null) {
// Кеш был очищен GC или создается впервые
cache = new HashMap<>();
cacheRef = new SoftReference<>(cache);
}
BufferedImage img = cache.get(path);
if (img == null) {
img = loadImageFromDisk(path); // Дорогая операция
cache.put(path, img);
}
return img;
}
}
Ключевые преимущества:
- Предотвращение
OutOfMemoryError: Кеш автоматически сокращается под давлением GC. - Автоматическое управление памятью: Не требуется сложная логика определения "наименее используемых" данных.
Важно: Получение объекта через SoftReference.get() может вернуть null в любой момент. Код должен быть готов к этому и пересоздавать данные.