0

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

所以,我所说的“合适”是指:

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

对我来说,这不是“过早的优化”,只是一种架构选择,可以减少将对象返回到池中的麻烦,但如果不满足特定要求,则会否定池的任何好处。

4

1 回答 1

0

没有理由认为SoftReferenceWeakReference不适用于任何 Java (tm) 平台或 Android。有一个Android 错误报告讨论了 Java (tm) 和 Android 行为之间的区别:Android 比 Java (tm) 更“急切地”清除软引用。但是,分析指出,差异是:

  • 通过设计,和
  • 在规范的“语义包络”内;即Java(tm) javadocs。

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

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

SoftReference 对于显式调整池大小没有用处。软引用只响应内存压力,而你几乎无法控制它。

最后,引用和引用队列会产生可观的 GC 开销。虽然它们没有被破坏,但 GC 在遇到它们时必须标记它们。当 GC 破坏它们时,将它们加入队列和处理排队的引用会产生可观的开销。

于 2017-03-15T13:59:53.070 回答