Каковы "практические последствия" использования мягких ссылок?
Согласно документации для гуавы MapMaker.softValues()
:
Предупреждение: в большинстве случаев лучше устанавливать максимальный размер для каждого кэша, а не использовать мягкие ссылки. Вы должны использовать этот метод, только если вы хорошо знакомы с практическими последствиями мягких ссылок.
У меня есть промежуточное понимание мягких ссылок - их поведение, использование и контракт с сборкой мусора. Однако мне интересно, каковы эти практические последствия, на которые ссылается документ. Почему именно лучше использовать максимальный размер, а не мягкие ссылки? Разве алгоритмы и поведение мягких ссылок не делают их использование более эффективным, чем жестко закодированный потолок, с точки зрения реализации кэша?
2 ответа
Я думаю, что все, на что они намекают, это то, что вы должны быть готовы к максимальному использованию памяти и, возможно, к большей активности gc, если вы используете мягкую карту ссылок, поскольку ссылки только gc'd, так как память должна быть освобождена.
Если вы знаете, что вам нужны только последние n значений в кэше, тогда использование LRU Cache - более гибкий подход с более предсказуемым использованием ресурсов для работающего приложения.
Кроме того, согласно этому, кажется, есть тонкие различия в поведении между JVM -server и -client.
Sun JRE относится к SoftReferences иначе, чем к WeakReferences. Мы пытаемся удержать объект, на который ссылается SoftReference, если нет давления на доступную память. Одна деталь: политика для JRE "-client" и "-server" различна: JRE -client старается сохранить ваш размер небольшим, предпочитая очищать SoftReferences, а не расширять кучу, тогда как JRE -server старается сохранить ваш высокая производительность, предпочитая расширять кучу (если возможно), а не очищать SoftReferences. Один размер не подходит для всех.
Одна из практических проблем с использованием SoftReferences заключается в том, что они, как правило, отбрасываются сразу. Причина, по которой у вас есть кэш, заключается в том, чтобы обеспечить большую производительность в большинстве случаев.
Однако использование SoftReferences для кэша может означать, что после остановки приложения для GC оно будет работать медленно, пока кэш не будет перестроен. Т.е. как раз в тот момент, когда вам нужно приложение, наверстать упущенное.
Примечание. Вы можете использовать LinkedHashMap в качестве кэша LRU, он не должен быть сложным.