2

我在我们的应用程序中使用了谷歌番石榴,基于下面的weakValues。

CacheBuilder
            .newBuilder()
            .weakValues()
            .concurrencyLevel(Runtime.getRuntime().availableProcessors())
            .removalListener(removalListener)
            .build(cacheLoader);

删除缓存弱值后不会立即调用删除侦听器。我必须基于此清除本机资源,因此我的程序结束时不会在本机端释放内存。这是一个已知问题吗?

4

2 回答 2

2

Google Guava docs中,它说明了以下内容:

使用 CacheBuilder 构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行,或任何类似的操作。相反,它在写入操作期间执行少量维护,或者如果写入很少,则在偶尔的读取操作期间执行。

还解释了他们做出此决定的原因以及可用的替代方案。

于 2015-09-18T21:20:40.997 回答
0

如果 JVM GC 声明了weakRef,我认为不会调用侦听器。该监听器应该只在驱逐策略触发驱逐时工作。例如 expireAfterWriter() 或 expireAfterAccess()

于 2017-12-12T20:33:44.667 回答