Reference Class in Java

2025年5月10日 | 阅读 4 分钟

Java 的 java.lang.ref.Reference 类 是 Java 中引用对象的抽象基类。它包含检索有关这些引用对象的信息的方法。然而,它不是一个直接的子类,因为与引用对象的交互与垃圾收集器紧密相关。

声明

引用类方法

方法描述
clear()此方法清除引用,阻止对象被添加到队列中。它只能由 Java 代码调用,而 垃圾收集器 可以直接清除引用而无需调用此方法。
enqueue()方法 将引用与其关联的队列进行注册。
get()此方法检索被引用的对象。如果对象已被 Java 代码或垃圾收集器清除,则返回 null。
isEnqueued()此方法检查引用是否已被添加到任何队列中。

引用对象类型

Reference 类支持三种类型的引用,每种引用都提供不同级别的可达性。

  • 软引用 (Soft References): 这些引用用于实现内存敏感的缓存。当 JVM 内存不足时,软引用会被清除,但在那之前它们保持有效。
  • 弱引用 (Weak References): 当对象不再被强引用可达时,弱引用允许对象被垃圾回收。这些对于实现弱哈希映射等映射非常有用。
  • 幽灵引用 (Phantom References): 幽灵引用用于在对象被 finalize 后安排清理操作。与弱引用和软引用不同,幽灵引用不会阻止对象被垃圾回收,直到指向它的所有幽灵引用都被清除。

与垃圾回收的交互

  • 垃圾回收和可达性: 垃圾收集器使用可达性级别来确定何时应收集对象。引用对象可以对该过程进行更精细地控制,使程序能够在对象即将被收集时收到通知。
  • 引用队列 (Reference Queues): 引用对象可以注册到一个 ReferenceQueue。当垃圾收集器检测到对象可达性的变化时,它会将引用添加到队列中。然后程序可以通过轮询或阻塞方式处理队列中的引用。
  • 自动清除:对象 不可达时,软引用和弱引用会被垃圾收集器自动清除。幽灵引用需要开发者的显式管理。

对象可达性级别

对象的自强到弱的可达性进行分类:

  • 强可达性 (Strong Reachability): 对象可以直接被程序访问,并且不可被垃圾回收。
  • 软可达性 (Soft Reachability): 对象不可强可达,但可以通过软引用访问。只有当 JVM 内存不足时,它才可能被垃圾回收。
  • 弱可达性 (Weak Reachability): 对象仅可通过弱引用访问。一旦弱引用被清除,对象就可能被垃圾回收。
  • 幽灵可达性 (Phantom Reachability): 对象已被 finalize,但仍可通过幽灵引用访问。只有当所有幽灵引用都被清除后,它才可能被垃圾回收。

算法

步骤 1: 创建一个对象和一个指向它的 WeakReference,并将其链接到一个 ReferenceQueue。

步骤 2: 使用 weakRef.get() 打印对象。

步骤 3: 将强引用设置为 null 并调用 System.gc(),然后检查 weakRef.get()。

步骤 4: 调用 weakRef.clear() 和 weakRef.enqueue()。

步骤 5: 使用 weakRef.isEnqueued() 验证引用是否已入队,并从队列中检索它。

实施

输出

 
Before GC: java.lang.Object@<hashcode>
After GC: null
Is Enqueued: false
After clear: null
Is Enqueued after enqueue: true
Reference from Queue: java.lang.ref.WeakReference@<hashcode>   

下一主题Java Full Stack