我知道 java.util
中有一个 WeakHashMap
,但是由于它对所有内容都使用 WeakReference
,因此它只被 this 引用Map
,被引用的对象会在下一次 GC 循环中丢失。因此,如果您想缓存随机数据,这几乎是没有用的,很可能会再次请求而不会在其余时间进行硬链接(hard link)。最好的解决方案是使用 SoftReference
的 map ,但我在 Java RT 包中没有找到。
最佳答案
编辑(2012 年 8 月):
事实证明,目前最好的解决方案可能是 Guava 13.0 的 Cache
类,解释于 Guava's Wiki - 这就是我要使用的。
它甚至支持构建 SoftHashMap
(参见 CacheBuilder.newBuilder().softKeys()
),但这可能不是您想要的,正如 Java 专家 Jeremy Manson 解释的那样(如下你会找到链接)。
不是I know of (2008 年 11 月),但是您可以在网上找到一些 SoftHashMap
的实现。
喜欢这个:SoftHashMap
或 this one .
编辑(2009 年 11 月)
如Matthias评论中提到,Google Guava MapMaker确实使用了软引用:
A
ConcurrentMap
builder, providing any combination of these features:
- soft or weak keys,
- 软或弱值,
- 定时到期,并且
- 按需计算值。
如 this thread 中所述,另一个 JSR166y 候选人:
jsr166y.ConcurrentReferenceHashMap
It provides an alternative concurrent reference map to the Google implementation (which relies on a background thread to evict entries)
编辑(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 ;它不支持定时删除,但它支持选择是否应该按身份或相等来比较 key 。此外,这个实现不是并发的——它可以被同步化,但是在来自多个线程的访问下效果不太好。
关于java - Java中有SoftHashMap吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/264582/