Каков вариант использования для мягкой ссылки в Java? - PullRequest
14 голосов
/ 11 марта 2010

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

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

Ответы [ 4 ]

18 голосов
/ 11 марта 2010

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

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

16 голосов
/ 11 марта 2010

Эта статья дала мне хорошее понимание каждого из них (слабые, мягкие и фантомные ссылки). Вот краткая цитата:

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

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

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

3 голосов
/ 11 марта 2010

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

0 голосов
/ 16 мая 2012

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

...