общий кеш гугл - значение по умолчанию MaximumSize (и другие «необязательные» настройки) - хотите кеш, который использует всю «доступную» память - PullRequest
3 голосов
/ 10 февраля 2012

Я только что нашел Гуава , выполнив поиск API для кэширования (он идеально подходит для моих нужд).Но один вопрос возник при чтении вики и Javadoc - какие значения настроек по умолчанию может использовать CacheBuilder? Javadoc заявляет «Все эти функции являются необязательными» и «Создает новый экземпляр CacheBuilder с настройками по умолчанию, в том числе со строгими ключами, строгими значениями и без какого-либо автоматического исключения любого типа».

ВПо моему мнению, хорошее значение по умолчанию для maximumSize было бы относительно Runtime.getRuntime().freeMemory();

. В конце я хочу кэш, который использует память, доступную в данной системе.Поэтому мне нужна стратегия выселения, которая спрашивает, сколько freeMemory() доступно (вероятно, относительно Runtime.getRuntime().maxMemory())

Ответы [ 2 ]

6 голосов
/ 10 февраля 2012

На самом деле, свободная память - не самый лучший показатель для удаления кеша.Причина в из-за сбора мусора.Недостаточно свободной памяти может означать, что теперь пришло время запустить сборщик мусора, после чего у вас внезапно появится много свободной памяти.Таким образом, вы не хотите удалить содержимое из кэша только потому, что у вас много накопленного мусора.

Один вариант - использовать softValues(), но я настоятельно рекомендую против, поскольку мягкие ссылки могут реально снизить производительность.

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

1 голос
/ 26 декабря 2016

Я задал мне вопрос об одном и том же и не смог найти в Интернете ничего для этого.Так что я сделал это очень примитивное испытание.Я написал фрагмент кода, который создает LocalCache с самой простой настройкой (без максимального размера, без политик вытеснения, ничего) и в бесконечном цикле помещает вещи в кеш.И контролировал его через VisualVm для проверки использования кучи.

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.concurrent.TimeUnit;

public class CacheTest {
    public static void main(String[] args) {
        Cache<String, String> cache = CacheBuilder.newBuilder().build();
        int counter = 0;
        while(true){
            cache.put("key"+counter++,"value");
            System.out.println("size:"+cache.size());
        }
    }
}

Как видно из изображения ниже, использование памяти увеличивается до максимально доступного пространства и становится постоянным.Я ждал несколько минут, и никакой ошибки OutOfMemoryError не произошло.Случилось так, что через несколько секунд на карту была добавлена ​​одна новая запись, поэтому в будущем, вероятно, произойдет ошибка.

Heap Dump

Вывод:Вам не нужно устанавливать значение MaximumSize, но я предлагаю вам использовать некую политику выселения (expireAfterAccess или expireAfterWrite), чтобы очистить кеш и избежать ошибки OutOfMemoryError.А также во избежание снижения производительности вашего кеша.

...