我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.
我有一个在JVM中运行的两个单独的缓存(一个由第三方库控制),每个缓存都使用软引用.我希望JVM在由库控制的缓存之前清除我的受控缓存.SoftReference javadoc指出:
在虚拟机抛出OutOfMemoryError之前,保证已清除对软可访问对象的所有软引用.否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序施加约束.但是,鼓励虚拟机实现偏向清除最近创建或最近使用的软引用.
该类的直接实例可用于实现简单的缓存; 此类或派生的子类也可用于更大的数据结构,以实现更复杂的高速缓存.只要软引用的引用是强可达的,即实际上是在使用中,软引用就不会被清除.因此,复杂的高速缓存可以例如通过保持对这些条目的强烈指示来防止其最近使用的条目被丢弃,留下剩余的条目由垃圾收集器决定丢弃.
常见的JVM实现(尤其是HotSpot)如何在实践中处理SoftReferences?他们是否"反对清除最近创建或最近使用的软参考",这是由规范所鼓励的?