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