我正在使用番石榴的Cache。每当Key无法再更严格地到达时,就应该对垃圾回收项进行垃圾收集(总有一天……)。如果没有从Value到Key的引用,则使用CacheBuilder.weakKeys()可以做到这一点。
我可以使此引用无效,但这可以随时使Value完全无效。我可以处理,但我不愿意。
我可以使用weakValues(),但这可能会导致非常早的驱逐,因为我的值仅在短时间内被引用。
也许我可以使用softValues(),但是SoftReference却很坏。
可能我弄错了...。什么是正确的解决方案?
更新资料
只需在每个Key中放置对Value的引用,就可以实现我所需要的,但这是不可能的,因为Key不在我的控制之下。如果是这样,那么我就不需要缓存,不需要弱引用,也不需要任何东西。
这样,每个Key都会保持其对应的Value可达,也就是fine1。同样,每个Value都将保持其Key的可访问性,但这没有问题,因为不再存在对Value的引用。
1一些到期会更好,但这不是必需的。
如果您可以控制值,请按Key key,WeakReference键。 如果我可以控制这些键并需要这样的功能,则倾向于在键weakThis中添加一个最终字段,以节省WeakReferences的数量。
不幸的是,没有星历表是无法解决的。
您的链接已失效,此链接有效。
阅读本文后,我认为您是对的。我碰到了"属性表"下描述的问题,该问题需要使用星历表。万一有人在意:我发现了一个非常简单的星历定义:它是一个键值对,如果星历及其键都可以到达,则值字段可以到达。
有什么好办法可以例如一个WeakHashMap,给定一个与集合中一个匹配的字符串的引用,它将返回集合中的一个,但是会丢弃集合之外不存在引用的字符串?将每个值都设为WeakReference可能是可行的,但似乎有些棘手,因为该集合已经保存了一个完美的WeakReference。
如果您确实需要weakKeys,那么从值到键的弱引用是正确的选择。
如果您觉得不合适,请提供有关您要完成的工作的更多信息。
实际上,我不能让Value引用Key的原因比我想象的要复杂。我现在不打算讨论这个问题,但是我补充了一些我需要的内容。
只要没有其他东西保持Value不变,Value-> Key的指针就无关紧要。
当缓存转储密钥时,将对其进行收集。
如果具有System-> Cache-> Key Cache Key
我认为它永远不会发生。有一个System->Cache->Value->Key链持续存在,直到该条目被逐出为止,即直到仅使用weakKeys()时永久存在。
您认为可以创建密钥副本并将其用作地图中的密钥吗?我在想你可能会喜欢
Value v = SomeLibrary.giveMeSomething();
String k = v.getName();
String k1 = new String(k);
cache.put(k1,v);
这将工作b / c k.equals(k1)和k!= k1。希望您可以创建用于Key的类型的副本或克隆(在您的情况下可能不是String)。
但是,这改变了密钥的生命周期-因为它不再是Value中的密钥。如果您可以控制放置在地图中的特定对象的生命周期,则可以。
您认为这可行吗?
不是我的情况...问题是值中对(原始)键的引用,这些键使键可访问。查看您接受的答案,以防您感兴趣。