Java 源码剖析——彻底搞懂Reference 和ReferenceQueue
283.24 KB
6 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
中文(简体) | .pdf | 3 |
摘要 | ||
文档详细分析了Java中的Reference和ReferenceQueue源码,揭示了它们在垃圾回收中的作用。ReferenceQueue是一个后进先出的数据结构,用于跟踪引用对象的可达性变化。其入队操作将引用实例添加到队列头部,出队操作从头部移除并返回引用。Reference类是引用对象的抽象基类,提供了get()、clear()和isEnqueued()方法来操作引用对象。ReferenceHandler线程负责将pending列表中的引用实例加入队列,并在引用实例的可达性发生变化时触发相应操作。文档还解释了引用实例的不同状态,包括Active、Pending、Enqueued和Inactive,以及如何通过成员变量queue和next来判断状态。 | ||
AI总结 | ||
《Java 満码剖析——彻到底搞懂 Reference 和 ReferenceQueue》
本文主要分析了 Java 中的 Reference 和 ReferenceQueue 的源码实现,揭示了它们在垃圾回收过程中的作用及内部工作机制。
### 一、Reference 类分析
1. **类概述**
Reference 是一个抽象基类,定义了所有引用对象的公共操作。它不能直接被子类化,主要用于与垃圾回收器配合实现不同类型的引用(软引用、弱引用、虚引用)。
- **构造函数**:
- `Reference(T referent)`:只传入引用对象,不注册到引用队列。
- `Reference(T referent, ReferenceQueue super T> queue)`:传入引用对象并注册到指定的引用队列中。
2. **主要成员**
- `private T referent`:被引用的实际对象。
- `volatile ReferenceQueue super T> queue`:当前引用实例注册的引用队列。
3. **核心方法**
- `public T get()`:返回被引用的实际对象。如果对象已被回收或引用被清除,返回 null。
- `public void clear()`:清除引用,置 referent 为 null。
- `public boolean isEnqueued()`:判断引用实例是否已加入引用队列。
4. **状态与变化**
- **Active 状态**:新创建的引用实例,未检测到实际对象的可达性变化。
- **Pending 状态**:实际对象不可达,引用实例被放入 pending 列表,等待 ReferenceHandler 线程处理。
- **Enqueued 状态**:引用实例被加入到引用队列中。
- **Inactive 状态**:引用实例从引用队列中移除,标识实际对象将被回收。
### 二、ReferenceQueue 类分析
1. **类概述**
ReferenceQueue 是引用队列,垃圾回收器会将注册的引用对象添加到队列中,供外部处理。
2. **内部实现**
- **成员变量**:
- `private volatile Reference extends T> head = null`:队列头节点。
- `private static ReferenceQueue NULL` 和 `private static ReferenceQueue ENQUEUED`:分别表示空队列和已执行入队操作的队列。
3. **入队与出队**
- **入队(enqueue)**:
- 将引用实例的 next 域指向当前头节点,并将头节点更新为当前引用实例。
- 使用 `lock.notifyAll()` 通知等待线程。
- **出队(poll)**:
- 取出头节点并将其 next 域清空,返回该引用实例。
4. **作用**
ReferenceQueue 是 Java GC 与引用对象之间的中间层,外部可通过它及时处理实际对象的可达性变化。
### 三、ReferenceHandler 线程
ReferenceHandler 是一个优先级最高的后台线程,主要负责将 pending 列表中的引用实例添加到引用队列中,并确保引用实例的处理逻辑正确执行。
### 四、总结
- **Reference 的作用**:
Reference 类是所有引用类型(软引用、弱引用、虚引用)的抽象基类,通过注册引用队列允许外部监控实际对象的可达性变化。
- 软引用(SoftReference):适合缓存场景,内存不足时回收。
- 弱引用(WeakReference):适合яч#$MARY对象的缓存,GC时会优先回收。
- 虚引用(PhantomReference):无法通过 get() 获取实际对象,主要用于跟踪对象被回收的状态。
- **ReferenceQueue 的作用**:
ReferenceQueue 是垃圾回收器与引用对象之间的中间层,用于及时处理实际对象的可达性变化,帮助外部逻辑采取相应操作。
- **应用场景**:
- `WeakHashMap`:通过引用队列判断键值对是否被回收,以维护_map{}_的有效性。
- `ThreadLocalMap`:通过轮询 `get()` 方法判断实际对象是否被回收。
通过分析 Reference 和 ReferenceQueue 的源码,可以更好地理解 Java 垃圾回收机制和引用类型的实际应用场景。 |
P1
P2
P3
P4
P5
P6
下载文档到本地,方便使用
文档评分