弱引用是否有实际用途?
2022-08-31 10:24:52
如果你想保留对某物的引用,只要它在其他地方使用,例如监听器,你可以使用弱引用。
WeakHashMap可以用作派生数据的密钥的短期缓存。它还可用于保存有关在其他位置使用的对象的信息,并且您不知道何时丢弃这些对象。
BTW 软引用类似于弱引用,但它们并不总是会立即清理。GC 将始终在可以时丢弃弱参照,并在可以时保留软参照。
还有另一种称为幻像引用的引用。这在GC清理过程中使用,指的是“正常”代码无法访问的对象,因为它正在清理过程中。
既然弱引用可以随时被垃圾回收器声明,那么有什么实际的理由使用它吗?
当然,使用它有实际原因。如果框架设计者花费了巨大的费用来构建一个不切实际的弱参考系统,那将是非常奇怪的,你不觉得吗?
我想你打算问的问题是:
人们使用弱引用的现实情况是什么?
有很多。一个常见的方法是实现性能目标。在对应用程序进行性能调整时,通常必须在更多内存使用量和更多时间使用量之间进行权衡。例如,假设有一个复杂的计算,你必须多次执行,但计算是“纯的” - 答案只取决于参数,而不是外生状态。你可以构建一个缓存 - 从参数到结果的映射 - 但随后会使用内存。你可能再也不会问这个问题了,那么这段记忆就会被浪费掉。
弱引用可能会解决这个问题;缓存可能会变得非常大,因此如果多次询问相同的问题,则可以节省时间。但是,如果缓存变得足够大,以至于垃圾回收器需要回收空间,它可以安全地执行此操作。
当然,缺点是垃圾回收器的清理策略经过调整,以满足整个系统的目标,而不是特定的缓存问题。如果 GC 策略和所需的缓存策略充分对齐,则弱引用是解决此问题的高度实用的解决方案。