Как кэшировать данные через Guava Cache, используя доступную память в качестве параметра? - PullRequest
0 голосов
/ 24 сентября 2019

Возможно ли удалить данные из кеша, когда доступная оперативная память рядом с переполнением?Реализация кеша ниже:

Cache<String, Cache<String, List<String>>> cache = CacheBuilder.newBuilder()
            .maximumWeight((int) ((Runtime.getRuntime().totalMemory() / 1024) * 0.9))
            .weigher((Weigher<String, Cache<String, List<String>>>) (key, val) -> runtimeMemory())
            .build();

public static int runtimeMemory() {
        long totalMemory = Runtime.getRuntime().totalMemory() / 1024;
        long freeMemory = Runtime.getRuntime().freeMemory() / 1024;
        return (int) (totalMemory - freeMemory);
    }

Это работа или нет?Или weigher суммирует runtimeMemory () для каждого значения?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

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

Лучший способ решить эту проблему - действительно и по-настоящему экспериментировать инайдите параметр maximumSize, который работает для вас.Ваша реализация также не будет работать, поскольку она не пытается взвесить одну конкретную запись.

0 голосов
/ 24 сентября 2019

Если ваша цель состоит в том, чтобы не допустить исчерпания памяти во всей JVM, то сборщик мусора - это то, что вам нужно.Я предлагаю вам использовать soft-values ​​, например, так:

Cache<String, Cache<String, List<String>>> cache = CacheBuilder.newBuilder()
        .softValues()
        .build();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...