对于弱引用有实际用途吗?
可能重复:
弱引用 - 它们有多有用?
由于垃圾收集器可以随时声明弱引用,因此使用它们有什么实际的理由吗?
如果只要在其他地方(例如Listener)使用某个引用,就可以使用弱引用。
WeakHashMap可以用作派生数据的密钥的短暂缓存。 它也可以用来保存有关使用的对象的信息,而不知道何时抛弃这些对象。
BTW软引用就像弱引用,但它们不会总是立即清除。 GC会一直放弃弱参考,并在可能时保留软参考。
还有一种称为幻影参考的参考。 这用于GC清理过程,指的是“正常”代码无法访问的对象,因为它正在清理过程中。
由于垃圾收集器可以随时声明弱引用,是否有任何实际的理由来使用它?
当然,有实际的理由来使用它。 如果框架设计师花费巨大的代价去建立一个不切实际的弱参考系统,那你会觉得奇怪吗?
我想你想问的问题是:
什么是人们使用弱引用的现实情况?
有许多。 常见的一个是实现绩效目标。 当调整应用程序的性能时,通常必须在更多的内存使用和更多的时间使用之间进行权衡。 假设例如有一个复杂的计算,你必须执行很多次,但是计算是“纯粹的” - 答案只取决于参数,而不取决于外生状态。 你可以构建一个缓存 - 一个从参数到结果的映射 - 但是它使用内存。 你可能再也不会问这个问题了,那么记忆就会被浪费掉。
弱引用可能解决这个问题; 缓存可能会变得非常大,因此如果多次询问同一问题,则会节省时间。 但是如果缓存变得足够大,垃圾收集器需要回收空间,那么它可以安全地进行。
不利的一面是垃圾收集器的清理策略被调整为满足整个系统的目标,而不是您特定的缓存问题。 如果GC政策和您期望的高速缓存策略足够一致,那么弱引用是解决此问题的高度实用的解决方案。
如果WeakReference是对象的唯一引用,并且您希望该对象处于悬停状态,则应该使用SoftReference来代替。
WeakReference最适用于那些会有其他对象引用的情况,但不能(或不想)必须检测何时不再使用这些其他引用。 然后,另一个引用将防止垃圾收集对象,并且WeakReference只是获取同一对象的另一种方式。
两种常见的用例是: