Каков прецедент для мягкой ссылки в Java?

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

Являются ли они называемыми мягкими ссылками в них, они мягкие и ломаются, когда "подвергаются стрессу", т.е. у JVM заканчивается память. Я понимаю слабые ссылки и ссылки phantom, но не действительно, когда они понадобятся.

Ответы

Ответ 1

Одно использование - для кэширования. Представьте, что вы хотите сохранить кеш в памяти больших объектов, но вы не хотите, чтобы этот кеш потреблял память, которая могла бы использоваться для других целей (так как кеш всегда можно перестроить). Сохраняя кэш мягких ссылок на объекты, ссылочные объекты могут быть освобождены JVM и память, которую они занимают повторно для других целей. Кэш должен был просто очистить сломанные софт-ссылки, когда он встретит их.

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

Ответ 2

В этой статье я дал хорошее понимание каждой из них (слабые, мягкие и phantom ссылки). Здесь обобщенное цитирование:

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

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

A phantom ссылка сильно отличается от SoftReference или WeakReference. Его сцепление с объектом настолько невелико, что вы даже не можете получить объект - его метод get() всегда возвращает null. Единственное, что используется для такой ссылки, - это отслеживать, когда она попадает в каталог ReferenceQueue, так как в этот момент вы знаете, что объект, на который он указал, мертв.

Ответ 3

Лучший пример, о котором я могу думать, - это кеш. Возможно, вы не захотите сбросить самые старые записи в кеше, если память станет проблемой. Кэширование графов больших объектов также может сделать это возможным.

Ответ 4

Пример того, как SoftReference можно использовать в качестве кеша, можно найти в этом сообщении .