ReferenceQueue 适合做对象池吗?

Is ReferenceQueue suitable for object pooling?

我想在我的库中使用缓冲池,并考虑使用 SoftReferences 来实现对象和池大小的隐式 return 平衡。

所以,"suitable" 我的意思是:

  1. 例如,与显式 ArrayBlockingQueue 相比,它们的性能是否相当? (小于数量级)
  2. 它们在现代 VM(如 Hotspot、Dalvik 和 ART)中是否足够可靠以表现 "softer" 而不是 WeakReferences?

对我来说,这不是 "premature optimization",只是一种架构选择,它可以减少 return 将对象放入池中的麻烦,但如果不满足指定的条件,将抵消池的任何好处要求。

没有理由认为 SoftReferenceWeakReference 不适用于任何 Java (tm) 平台或 Android。有一个 Android bug report 讨论了 Java (tm) 和 Android 行为之间的区别:Android 比 Java 清除软引用更多 "eagerly" ( Tm值)。但是,分析指出差异是:

  • 设计,
  • 在规范的"semantic envelop"范围内;即 Java(tm) javadocs.

但是,我不明白的是您建议如何使用 Reference 对象来实现 return 个对象(到池)。如果已分配缓冲区的代码丢弃了它对该对象的(强)引用,那么弱引用或软引用将在引用入队之前被清除。这意味着缓冲区将在缓冲池的 ReferenceQueue 听到它之前被 GC。

另一方面,如果您只是使用弱/软引用以使池不是内存泄漏……那没关系。 SoftReference是正确的选择。

SoftReference 对于显式调整池大小没有用。软引用仅响应内存压力,您对此几乎没有控制权。

最后,引用和引用队列会产生明显的 GC 开销。当它们未被破坏时,GC 必须在遇到它们时标记它们。当 GC 破坏它们时,对它们进行排队和处理排队的引用会有相当大的开销。