2010-03-10 4 views
13

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

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

ответ

16

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

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

+0

Чтобы добавить, похоже, что мягкие ссылки в принципе такие же, как система управления памятью Linux (или любые другие ОС), где страницы загружаются по требованию. Просто Linux может реализовать несколько алгоритмов замены страниц. Как насчет сборщика мусора Java? Может ли он (или может быть настроен) использовать шаблоны использования объектов для выбора Soft Reference to Garbage Collect? –

3

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

16

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

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

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

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

+0

+1 для резюме :) Вот такой текст, который я ищу: P Что касается фантомных ссылок ... это выглядит очень странно, я думаю, его главная цель - служить артефактом для инструментов отладки или таких вещей, как что. – OscarRyz

+1

@ Oscar: ссылки Phantom также могут использоваться для создания более безопасной финализации, чем стандартный метод 'finalize' (я прочитал это в тексте справки по профилированию, но нашел здесь некоторое обсуждение - http://code-o-matic.blogspot.com /2009/01/subtleties-of-phantomreference-and.html). –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^