Одна проблема с сильными ссылками кэшируется, конкретный с очень большими структурами как изображения. Предположим, что у Вас есть приложение, которое должно работать с предоставленными пользователями изображениями, как инструмент дизайна веб-сайта, я продолжаю работать. Естественно Вы хотите кэшировать эти изображения, потому что загрузка их от диска является очень дорогой, и Вы хотите избежать возможности наличия двух копий (потенциально гигантского) изображения в памяти сразу.
, поскольку кэш изображений, как предполагается, препятствует тому, чтобы мы перезагрузили изображения, когда мы не абсолютно должны, Вы быстро поймете, что кэш должен всегда содержать ссылку на любое изображение, которое уже находится в памяти. С обычными сильными ссылками, тем не менее, что сама ссылка вынудит изображение остаться в памяти, которая требует, чтобы Вы так или иначе определили, когда изображение больше не необходимо в памяти и удаляет ее из кэша, так, чтобы это стало имеющим право на сборку "мусора". Вы вынуждены копировать поведение сборщика "мусора" и вручную определить, должен ли объект быть в памяти.
Слабые ссылки Понимания , Ethan Nicholas
Одно различие, чтобы быть ясным на является различием между WeakReference
и SoftReference
.
В основном WeakReference
будет GCD JVM нетерпеливо, как только ссылочный объект не имеет никакого твердый ссылки на него. SoftReference
объект d, с другой стороны, будет иметь тенденцию быть оставленным о сборщиком "мусора", пока это действительно не должно будет исправлять память.
кэш А, где значения считаются внутренние WeakReference
с, был бы довольно бесполезен (в WeakHashMap
, это - ключи, на которые слабо ссылаются). SoftReferences
полезны для переноса значений, когда Вы хотите реализовать кэш, который может вырасти и уменьшиться с доступной памятью
Одно Общее использование WeakReference
с и WeakHashMap
с в особенности для добавления свойств к объектам. Иногда Вы хотите добавить некоторую функциональность или данные к объекту, но разделение на подклассы и/или состав не являются опцией в этом случае, очевидная вещь сделать состояла бы в том, чтобы создать hashmap соединение объекта, который Вы хотите расширить до свойства, которое Вы хотите добавить. тогда каждый раз, когда Вам нужно свойство, можно просто искать его в карте. Однако, если объекты Вы добавляете свойства, чтобы иметь тенденцию быть уничтоженными и создали много, можно закончить с большим количеством старых объектов в карте, поднимающей большую память.
, Если Вы используете WeakHashMap
вместо этого, объекты оставят Вашу карту, как только они больше не используются остальной частью Вашей программы, которая является желаемым поведением.
я должен был сделать это для добавления некоторых данных к java.awt.Component
для обхождения изменения в JRE между 1.4.2 и 1.5, я, возможно, зафиксировал его путем разделения на подклассы каждого компонента, я был заинтересован интервал (JButton
, JFrame
, JPanel
....), но это было намного легче с намного меньшим количеством кода.
Это сообщение в блоге демонстрирует использование обоих классов: Java: синхронизация на идентификаторе . Использование проходит примерно так:
private static IdMutexProvider MUTEX_PROVIDER = new IdMutexProvider();
public void performTask(String resourceId) {
IdMutexProvider.Mutex mutext = MUTEX_PROVIDER.getMutex(resourceId);
synchronized (mutext) {
// look up the resource and do something with it
}
}
IdMutextProvider обеспечивает основанные на идентификаторе объекты синхронизироваться на. Требования:
, Это достигается с помощью карты внутренней памяти типа:
WeakHashMap<Mutex, WeakReference<Mutex>>
объект является и ключом и значением. Когда ничто внешнее к карте не имеет твердую ссылку на объект, это может быть собрано "мусор". Значения в карте снабжены твердыми ссылками, таким образом, значение должно быть обернуто в WeakReference для предотвращения утечки памяти. На этот последний вопрос отвечают в javadoc.
Если Вы, например, хотите отслеживать все объекты, созданные из определенного класса. Чтобы все еще позволить этим объектам быть собранными "мусор", Вы сохраняете список/карту слабых ссылок на объекты вместо самих объектов.
Теперь, если бы кто-то мог бы объяснить фантомные ссылки на меня, я был бы счастлив...
Как указано выше, слабая ссылка сохранены столько, сколько сильная ссылка существует.
использование в качестве примера должно было бы использовать WeakReference внутренние слушатели, так, чтобы слушатели больше не были активны, как только основной ссылки на их целевой объект не стало. Обратите внимание, что это не означает, что WeakReference удален из списка слушателей, чистка все еще требуется, но может быть выполнена, например, в запланированные времена. Это имеет также эффект предотвращения объекта, который слушают от содержания сильных ссылок и в конечном счете быть источником чрезмерного увеличения размера памяти. Пример: компоненты графического интерфейса пользователя Swing, отсылающие модель, имеющую более длительный жизненный цикл, чем окно.
При игре со слушателями, как описано выше мы быстро поняли, что объекты "сразу" собраны с точки зрения пользователя.
Одно использование реального мира, которое я имел для WeakReferences, состоит в том, если у Вас есть единственный, очень большой объект, это редко используется. Вы не хотите сохранять его в памяти, когда это не нужно; но, если другому потоку нужен тот же объект, Вы не хотите двух из них в памяти также. Можно сохранить слабую ссылку на объект где-нибудь и твердые ссылки в методах, которые используют его; когда методы оба конца, объект будет собран.
Я сделал поиск кода Google "нового WeakHashMap ()".
я получил набор соответствий из проекта пути к классу GNU и
можно использовать weakhashmap для реализации кэширования без ресурсов для расширяемого создания объекта.
, но примечание, что это не является желаемым для имения изменяемых объектов. я привык его для результатов запроса кэша (которые берут приблизительно 400 мс для выполнения) к текстовой поисковой системе, которая редко обновляется.