ReferenceQueue 适合做对象池吗?
Is ReferenceQueue suitable for object pooling?
我想在我的库中使用缓冲池,并考虑使用 SoftReference
s 来实现对象和池大小的隐式 return 平衡。
所以,"suitable" 我的意思是:
- 例如,与显式 ArrayBlockingQueue 相比,它们的性能是否相当? (小于数量级)
- 它们在现代 VM(如 Hotspot、Dalvik 和 ART)中是否足够可靠以表现 "softer" 而不是
WeakReference
s?
对我来说,这不是 "premature optimization",只是一种架构选择,它可以减少 return 将对象放入池中的麻烦,但如果不满足指定的条件,将抵消池的任何好处要求。
没有理由认为 SoftReference
或 WeakReference
不适用于任何 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 破坏它们时,对它们进行排队和处理排队的引用会有相当大的开销。
我想在我的库中使用缓冲池,并考虑使用 SoftReference
s 来实现对象和池大小的隐式 return 平衡。
所以,"suitable" 我的意思是:
- 例如,与显式 ArrayBlockingQueue 相比,它们的性能是否相当? (小于数量级)
- 它们在现代 VM(如 Hotspot、Dalvik 和 ART)中是否足够可靠以表现 "softer" 而不是
WeakReference
s?
对我来说,这不是 "premature optimization",只是一种架构选择,它可以减少 return 将对象放入池中的麻烦,但如果不满足指定的条件,将抵消池的任何好处要求。
没有理由认为 SoftReference
或 WeakReference
不适用于任何 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 破坏它们时,对它们进行排队和处理排队的引用会有相当大的开销。