Java中是否有SoftHashMap?
我知道有一个 in ,但是由于它使用 s 来表示所有内容,因此仅由此引用 ,引用的对象将在下一个 GC 周期中丢失。因此,如果您想缓存随机数据,这几乎毫无用处,这很可能在其余时间没有硬链接的情况下再次被请求。最好的解决方案是使用s的映射,但我在Java RT包中没有找到一个。WeakHashMap
java.util
WeakReference
Map
SoftReference
我知道有一个 in ,但是由于它使用 s 来表示所有内容,因此仅由此引用 ,引用的对象将在下一个 GC 周期中丢失。因此,如果您想缓存随机数据,这几乎毫无用处,这很可能在其余时间没有硬链接的情况下再次被请求。最好的解决方案是使用s的映射,但我在Java RT包中没有找到一个。WeakHashMap
java.util
WeakReference
Map
SoftReference
编辑(2012年8月):
事实证明,目前最好的解决方案可能是番石榴13.0的类,在番石榴的Wiki上进行了解释 - 这就是我要使用的。它甚至支持构建一个(参见),但它可能不是你想要的,正如Java专家Jeremy Manson所解释的那样(下面你会发现链接)。Cache
SoftHashMap
CacheBuilder.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;它不支持定时删除,但它确实支持选择是否应按标识或相等性比较键。此外,此实现不是并发的 - 它可以同步,但在来自多个线程的访问下效果较差。
我熟悉两个提供SoftHashMap实现的库:
Apache Commons: org.apache.commons.collections.map.ReferenceMap
Google Collections: com.google.common.collect.ReferenceMap