我想要一个最大保留容量为 N 的缓存。我允许它最多容纳 N 个对象,否则这些对象将有资格进行 GC。现在,如果我的应用程序本身当前持有 N+1 对之前添加到缓存中的对象的强引用,我希望缓存也持有 N+1。为什么?因为缓存不会比其他情况更长时间地阻止这个 N+1th 对象被收集,而且我可以用更大的哈希表来换取更多的缓存命中。
另一种说法是,我想要一个对象缓存,它保留添加到其中的所有对象,同时它们保持强可达性,并且还保留足够的非强可达性对象以保持其大小 == N。
例子
我们创建了一个 N=100 的缓存。大小从 0 开始。添加了 150 个对象,大小为 150。这些对象中的 100 个变得非强可达(弱,软,等等)。缓存驱逐其中的 50 个并保留 50 个,大小为 100。添加了 49 个更强大的可达对象。大小仍然是 100,但现在其中 99 个是强可达的,只有一个是非强可达的。发生的事情是 49 个旧的、非强可达的对象被新的 49 个替换,因为新的对象是强可达的。
动机
我怀疑对于许多用例来说,这实际上是一件直观的事情。通常,缓存的容量会权衡缓存命中概率以保证最大内存使用。了解它所持有的对象的可达性后,缓存可以在不改变其最大内存使用保证的情况下提供更高的缓存命中概率。
麻烦
我担心这在JVM上是不可能的。我希望别人告诉我,但如果你知道一个事实是不可能的,如果有理由的话,我也会接受这个答案。