我知道有一个WeakHashMap
in java.util
,但由于它只使用了WeakReference
s,只有这个Map
引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReference
s代替的地图,但我没有在Java RT Package中找到一个.
编辑(2012年8月):
事实证明,目前最好的解决方案可能是Guava 13.0的Cache
类,在Guava的Wiki上解释- 这就是我将要使用的.它甚至支持构建SoftHashMap
(参见参考资料CacheBuilder.newBuilder().softKeys()
),但它可能不是你想要的,正如Java专家Jeremy Manson解释的那样(下面你会找到链接).
不是我所知道的(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