Module
java.base
Package java.lang.ref
提供参考对象类,它支持与垃圾收集器的有限度的交互。
程序可以使用引用对象来维护对某个其他对象的引用,使得后一对象可能仍然被收集器回收。
在收集者确定给定对象的可达性已经改变之后,程序也可以安排通知一段时间。
包装规格
引用对象封装了一些其他对象的引用,使得引用本身可以像任何其他对象一样进行检查和操作。 提供了三种类型的参考对象,一个比一个弱: 软 , 弱 ,和幻象 。 每种类型对应于不同的可达性级别,如下所述。 软引用用于实现内存敏感缓存,弱引用用于实现不阻止其键(或值)回收的规范化映射,幻像引用用于调度事后清除操作。 验尸清理行动可以通过Cleaner
进行注册和管理。
每个引用对象类型由抽象基础Reference
类的子类实现。 这些子类之一的实例封装了一个称为对象的特定对象的单引用 。 每个引用对象都提供了获取和清除引用的方法。 除了清算操作之外,参考对象是不可变的,因此不提供set
操作。 程序可以进一步子类化这些子类,为其目的添加所需的任何字段和方法,或者可以使用这些子类而不改变。
通知
程序可以通过在创建参考对象时注册具有参考队列的适当参考对象来请求通知对象可达性的变化。 在垃圾回收器确定指示物的可达性已更改为与引用类型相对应的值之后的某个时间,它将清除引用并将其添加到关联的队列中。 在这一点上,引用被认为是入队的 。 该程序可以通过轮询或阻塞直到引用可用来删除队列中的引用。 参考队列由ReferenceQueue
类实现。
注册参考对象与其队列之间的关系是片面的。 也就是说,队列不跟踪注册的引用。 如果注册的引用本身不可达,那么它永远不会被排入队列。 使用参考对象的程序有责任确保只要程序对其指示感兴趣,对象仍然可以访问。
虽然一些程序将选择专用线程从一个或多个队列中删除引用对象并处理它们,但这绝对不是必需的。 通常工作良好的策略是在执行其他相当频繁的操作过程中检查参考队列。 例如,使用弱引用来实现弱键的散列表可以在每次访问表时轮询其引用队列。 这是WeakHashMap
课程的工作原理。 因为ReferenceQueue.poll
方法只是检查一个内部的数据结构,所以这个检查对于哈希表访问方法将增加一点开销。
可达性
从最强到最弱,不同层次的可达性反映了物体的生命周期。 它们的操作定义如下:- 如果某个线程可以在没有遍历任何引用对象的情况下达到该对象,则该对象是强大的可访问的 。 新创建的对象由创建它的线程强大可见。
- 如果物体不可靠,但通过穿过软参考点可以达到,物体可轻松到达 。
- 一个对象是弱可及 ,如果它是既不坚决也不是软可及的,但通过遍历弱引用可以到达。 当对弱可触及对象的弱引用被清除时,该对象就可以进行定稿。
- 一个对象是幻影可以到达,如果它既不强烈,轻微,也不弱可达,它已经定稿,一些幻影参考是指它。
- 最后,一个对象是无法访问的 ,因此,如果以上述任何一种方式都无法访问,就可以进行填海。
- 从以下版本开始:
- 1.2
-
接口摘要 接口 描述 Cleaner.Cleanable Cleanable
表示在Cleaner
注册的对象和清洁动作。 -
类摘要 Class 描述 Cleaner Cleaner
管理一组对象引用和相应的清理动作。PhantomReference<T> 在收集者确定其指示物可能被回收之后排入队列的Phantom参考对象。Reference<T> 参考对象的抽象基类。ReferenceQueue<T> 在检测到适当的可达性更改后,引用队列被垃圾收集器附加到哪个已注册的参考对象。SoftReference<T> 软参考对象,由垃圾收集器根据内存需求自行清除。WeakReference<T> 弱参考对象,不会阻止其指定对象的最终确定,最终确定,然后被回收。