【发布时间】:2012-07-12 06:01:43
【问题描述】:
我正在使用 Guava 的 Cache<Key, Value>。每当Key 不再强可达时,缓存条目应该被垃圾收集(总有一天......)。如果没有从 Value 到 Key 的引用,则使用 CacheBuilder.weakKeys() 可以做到这一点。
我可以使这个引用变弱,但这可能随时使我的Value 完全无效。我可以处理它,但我不想这样做。
我可以使用weakValues(),但这可能会导致很早就被驱逐,因为我的值只会在短时间内被引用。
也许我可以使用softValues(),但SoftReferences 是quite broken。
可能我弄错了……什么是正确的解决方案?
更新
只需将Value 的引用放入每个Key 即可实现我所需要的,但这是不可能的,因为Key 不在我的控制之下。如果是,那我就不需要缓存,不需要弱引用,什么都不需要。
这样,每个Key 都会保持其对应的Value 可达,这很好1。此外,每个Value 都会保持其Key 可访问,但这没有问题,因为不再存在对Value 的引用。
1有些过期会更好,但不是必须的。
【问题讨论】:
-
如果您可以控制价值,请创建
Key key、WeakReference<Key>键。如果我可以控制密钥并需要此类功能,我倾向于在密钥weakThis中添加一个最终字段,以节省 WeakReferences 的数量。
标签: java caching guava weak-references