2016-09-15 3 views
2

У меня есть вычислительная интенсивная однократная автономная обработка, которая требует от меня нескольких часов, и я использую Caffeine как мой кеш в памяти. Что такое хорошая эвристика для установки максимального размера кеша? Я запускаю свою Java-программу с 8 ГБ оперативной памяти, и я готов предоставить кэш около 4 ГБ, но я не уверен, как память переводится в фактический размер моего кэша. Я решил пойти с .softValues() позволить JVM решить, но я столкнулся с такими словами в JavaDoc Кофеин:Caffeine: Как найти подходящий размер кеша

Внимание: в большинстве случаев это лучше установить в-кэш максимального размера вместо использования мягкого Рекомендации. Этот метод следует использовать только в том случае, если вы хорошо знакомы с практическими последствиями мягких ссылок.

ответ

2

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

Мягкие ссылки не должны быть по умолчанию, перейдите к стратегии. Это может быть разумным упрощением в пропускной способности, не связанной с лицом задачи. Но когда время GC, латентность и прогнозируемая производительность важны, это может быть опасно.

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

1

Мягкие ссылки позволяют VM восстанавливать объект, если у него заканчивается память. Это по-другому представляет собой стратегию для кеша. Вы могли бы просто иметь WeakHashMap (есть, однако, разница между SoftReference и WeakReference)

Одна большая разница в том, что кэш обычно позволяет вам принять решение о стратегии выселять объектов (LRU, ФИФО и т.д.), а выиграл Soft/Слабые ссылки «т.

Вы должны уметь определять размер объекта по крайней мере по величине. Это 1k, 1mb, 10mb?

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

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