Как стать автором
Обновить

Комментарии 23

Как же вы вовремя! Как-раз делаю нечто очень похожее на ваш «надуманный» пример. Спасибо за полезную статью.
Рад что эта статья кому-то пригодится. Советую перед использованием Reference, сформулировать себе чего именно вы хотите достичь. Часто бывает, что непродуманное использование приводит только к снижению производительности.
У вас вот очень даже хорошо сформулировано, прямо как под заказ: мне нужен кеш изображений, работающий по принципу — держать в памяти пока её хватает, удалять изображения из памяти, если её становится мало. SoftReference подходит идеально.
Хотя вот ниже пишут, что это не идеальное решение. Ушел разбираться.
Очень интересная тема, надо бы разобраться во всех нюансах. Не подозревал о таких возможностях джавы под боком.
Будучи дотнетчиком, сильно уважаю джаву за её технологичность и открытость. Замечательная статья, спасибо!
Да, я как-то писал кэш объектов на основе WeakReference дотнета. Если проводить параллели, то они больше соответствуют SoftReference, чем одноимённым ссылкам:
A weak reference is valid only during the indeterminate amount of time until the object is collected when no strong references exist.
Хочу добавить, что если программируете под андроид, то лучше не использовать SoftReference для кеширование. Поведение Dalvik VM с SoftReference не совсем такое, как на JVM, и они могут быть удалены слишком рано, что сведёт на нет всю пользу от кеша. В документации к SoftReference на андроиде советуют использовать LruCache.
По поводу Dalvik VM не скажу, но вот по поводу JVM часто можно встретить подобные высказывания. Многие, в качестве лучшей альтернативы, рекомендуют использовать кэш, который реализовывает LRU алгоритм. Например в LinkedHashSet можно переопределить метод removeEldestEntry. Но нельзя говорить о том что кэш на основе SoftReference всегда проигрывает. У него есть свои плюсы. Как пример, почитайте обсуждение тут — SoftReference Read-Write Cache для Hibernate
А не подскажете, соответствует ли работа Dalvik-а с PhantomReference официальной документации, или тоже существуют какие-то подводные камни?
Очень познавательно, спб!
Прочел я эту статью о хитростях и премудростях Java и возрадовался, что программирую на Си.
Насоздают софтссылок, в итоге жабоприложение выжирает память откуда только можно и сваливает полсистемы в своп. Привет, тормоза. При этом софтссылки автоматом не очищаются, т. к. память-то как бы есть и приложение больше не просит. А то что там кому-то другому не хватает памяти, жабе пофигу.
Привет, java -help
Вы кого обвиняете? Автора за то, что он рассказал про один из инструментов джавы? Давайте ещё производителей ножей обвиним, в том, что «понакупают ножей, а потом убивают обычных людей».
Ваше «жабоприложение» выжрет памяти не больше чем вы ему разрешите.
По дефолту разрешено весьма до фига.
Немного сумбурно, но всё-таки полезная статья, знал про них, но всегда забывал разобраться подробнее.
PS: Зайдите пожалуйста сюда и если не сложно, то поправьте статью, читать тяжело.
эх, зря я пользовался для организации кэшей WeakHashMap. Так что, спасибо за статью, было трудно усвоить различия между разными типами ссылок.
Отмечу, что MapMaker.makeComputingMap() в Guava — deprecated с версии 10.0 (сейчас уже 14.0). Вместо него нужно использовать CacheBuilder.build()
За что заминусовали-то???
… сколько времени существует soft-ссылка после последнего обращения к ней. Обозначим этот интервал буквой I

… после последнего обращения к ней коллектором:
interval is the time between the last GC's clock and the timestamp of the ref we are currently examining…

линк
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.