Java中是否有SoftHashMap?

我知道有一个 in ,但是由于它使用 s 来表示所有内容,因此仅由此引用 ,引用的对象将在下一个 GC 周期中丢失。因此,如果您想缓存随机数据,这几乎毫无用处,这很可能在其余时间没有硬链接的情况下再次被请求。最好的解决方案是使用s的映射,但我在Java RT包中没有找到一个。WeakHashMapjava.utilWeakReferenceMapSoftReference


答案 1

编辑(2012年8月):

事实证明,目前最好的解决方案可能是番石榴13.0的类,在番石榴的Wiki上进行了解释 - 这就是我要使用的。它甚至支持构建一个(参见),但它可能不是你想要的,正如Java专家Jeremy Manson所解释的那样(下面你会发现链接)。CacheSoftHashMapCacheBuilder.newBuilder().softKeys()


不是我所知道的(2008年11月),但你在网上找到了一些实现。SoftHashMap

比如这个:SoftHashMap这个


编辑(2009年11月)
正如Matthias在评论中提到的,Google Guava MapMaker确实使用了SoftReferences:

构建器,提供以下功能的任意组合:ConcurrentMap

  • 软键或弱键,
  • 软值或弱值,
  • 定时过期,以及
  • 按需计算值。

此线程中所述,另一个 JSR166y 候选项:

jsr166y.ConcurrentReferenceHashMap

它为Google实现提供了另一个并发引用映射(它依赖于后台线程来逐出条目)


编辑(2012年8月)

Google 实现仅在请求条目定时过期时才使用后台线程。特别是,它只是使用 ,这不像具有单独的后台线程那样具有侵入性。java.util.Timer

Jeremy Manson建议,对于任何缓存,使用此功能来避免SoftReference的危险:http://jeremymanson.blogspot.de/2009/07/how-hotspot-decides-to-clear_07.html

Apache Commons还有另一个实现,即org.apache.commons.collections.map.ReferenceMap;它不支持定时删除,但它确实支持选择是否应按标识或相等性比较键。此外,此实现不是并发的 - 它可以同步,但在来自多个线程的访问下效果较差。


答案 2

我熟悉两个提供SoftHashMap实现的库:

  1. Apache Commons: org.apache.commons.collections.map.ReferenceMap

  2. Google Collections: com.google.common.collect.ReferenceMap