ReferenceQueue适用于对象池吗?

时间:2017-03-15 10:51:48

标签: java android pooling soft-references

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

所以,“适当”我的意思是:

  1. 例如,与显式的ArrayBlockingQueue相比,它们是否具有相当的性能? (小于数量级)
  2. 它们在现代虚拟机(如Hotspot,Dalvik和ART)中的可靠性是否比WeakReference更“柔和”?
  3. 对我来说,这不是“过早优化”,只是一种架构选择,可以减少将对象返回池中的麻烦,但如果不符合规定的要求,则会否定池的任何好处。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

最后,引用和引用队列会产生可观的GC开销。虽然它们是完整的,但GC必须在遇到它们时标记它们。当GC破坏它们时,在将它们排队以及处理排队的Reference时会有明显的开销。