可能重复问题:
弱引用 - 它们有多有用?
由于弱引用可以被垃圾回收器在任何时间收回,那么使用它们还有什么实际的理由吗?
可能重复问题:
弱引用 - 它们有多有用?
由于弱引用可以被垃圾回收器在任何时间收回,那么使用它们还有什么实际的理由吗?
如果您想在某个其他地方使用时保留对某个内容的引用,比如一个Listener,您可以使用弱引用。
WeakHashMap可被用作键到派生数据的短期缓存。它也可用于保持有关对象的信息,这些对象在其他地方使用且您不知道何时这些对象将被丢弃。
顺便说一下,软引用类似于弱引用,但它们不会立即被清理。GC会尽可能清除弱引用,并在可能的情况下保留Soft Reference。
还有另一种引用称为幻影引用。它用于GC清理过程并引用无法访问“正常”代码的对象,因为该对象正在被清理。
当对象还有其他的引用,但你不能(或不想)检测这些引用是否不再使用时,最好使用WeakReferences。此时,其他引用将防止对象被垃圾回收,而WeakReference只是另一种访问同一对象的方式。
两个常见的用例是:
我们出于这个原因使用它 - 在我们的例子中,我们有许多必须向服务注册的监听器。服务保留对监听器的弱引用,而实例化的类则保留强引用。如果任何时候类被垃圾回收了,弱引用就是监听器的全部,随之也会被垃圾回收。这使得跟踪中间类变得更容易。
弱引用最常见的用法是用于"查找" Maps 中的值。
使用普通(硬)值引用时,如果映射表中的值不再具有其他地方的引用,那么您通常不再需要查找。而对于弱引用映射值而言,一旦它没有其他引用,该对象就成为垃圾收集的候选对象。
映射本身拥有该对象的唯一引用并不会阻止其被垃圾收集,因为该引用是一个弱引用。
弱引用是指不保护所引用对象免于被垃圾回收器回收的引用。
我通常使用它作为某种类型的缓存。最近访问的项目可以立即使用,在缓存未命中的情况下重新加载该项目(数据库、文件系统等)。
我使用WeakSet
来编码图中的链接。如果一个节点被删除,链接会自动消失。
gc.collect()
。这样就足以保证它能正常工作了吗?边缘结构很复杂,而且明确断开连接会很麻烦。 - Neil G