我想在我的库中使用缓冲池,并考虑使用SoftReference
s 来实现对象的隐式返回和池大小平衡。
所以,我所说的“合适”是指:
- 例如,与显式 ArrayBlockingQueue 相比,它们的性能是否相当好?(小于数量级)
- 它们在现代 VM(如 Hotspot、Dalvik 和 ART)中是否足够可靠,可以表现得比
WeakReference
s 更“软”?
对我来说,这不是“过早的优化”,只是一种架构选择,可以减少将对象返回到池中的麻烦,但如果不满足特定要求,则会否定池的任何好处。
我想在我的库中使用缓冲池,并考虑使用SoftReference
s 来实现对象的隐式返回和池大小平衡。
所以,我所说的“合适”是指:
WeakReference
s 更“软”?对我来说,这不是“过早的优化”,只是一种架构选择,可以减少将对象返回到池中的麻烦,但如果不满足特定要求,则会否定池的任何好处。
没有理由认为SoftReference
或WeakReference
不适用于任何 Java (tm) 平台或 Android。有一个Android 错误报告讨论了 Java (tm) 和 Android 行为之间的区别:Android 比 Java (tm) 更“急切地”清除软引用。但是,分析指出,差异是:
但是,我不明白的是您建议如何使用 Reference 对象来实现对象的返回(到池)。如果已分配缓冲区的代码丢弃其对对象的(强)引用,则弱引用或软引用将在引用入队之前被清除。这意味着缓冲区将在缓冲池的 ReferenceQueue 听到它之前被 GC 处理。
另一方面,如果您只是使用弱/软引用,以便池不是内存泄漏......那没关系。 SoftReference
是正确的选择。
SoftReference 对于显式调整池大小没有用处。软引用只响应内存压力,而你几乎无法控制它。
最后,引用和引用队列会产生可观的 GC 开销。虽然它们没有被破坏,但 GC 在遇到它们时必须标记它们。当 GC 破坏它们时,将它们加入队列和处理排队的引用会产生可观的开销。