Google Guava Cache на слабой ссылке не дает уведомления о выселении
Я использовал Google Guava в нашем приложении на основе слабых значений, как показано ниже.
CacheBuilder
.newBuilder()
.weakValues()
.concurrencyLevel(Runtime.getRuntime().availableProcessors())
.removalListener(removalListener)
.build(cacheLoader);
Слушатель удаления не вызывается сразу после удаления слабого значения кэша. Я должен очистить собственный ресурс, основываясь на этом, и, таким образом, моя программа заканчивается без освобождения памяти в исходном конце. Это известная проблема?
2 ответа
В Google Guava Docs говорится следующее:
Кэши, созданные с помощью CacheBuilder, не выполняют очистку и высвобождают значения "автоматически", или сразу после истечения срока действия, или чего-либо подобного. Вместо этого он выполняет небольшие объемы обслуживания во время операций записи или во время периодических операций чтения, если записи выполняются редко.
Также объясняется, почему они приняли это решение и какие есть альтернативы.
Я не думаю, что слушатель будет вызван, если JVM GC заявит о слабости. этот слушатель должен работать только тогда, когда политика выселения вызывает выселение. например, expireAfterWriter() или expireAfterAccess()