看看Java层的代码-济南达内培训负责整理
    private static class ReferenceHandler extends Thread {
    …
    public void run() {
    while (true) {
    tryHandlePending(true);
    }
    }
    }
    static boolean tryHandlePending(boolean waitForNotify) {
    Reference<Object> r;
    Cleaner c;
    try {
    synchronized (lock) {
    if (pending != null) {
    r = pending;
    //如果是Cleaner对象,则记录下来,下面做特殊处理
    c = r instanceof Cleaner ? (Cleaner) r : null;
    //指向PendingList的下一个对象
    pending = r.discovered;
    r.discovered = null;
    } else {
    //如果pending为null就先等待,当有对象加入到PendingList中时,jvm会执行notify
    if (waitForNotify) {
    lock.wait();
    }
    // retry if waited
    return waitForNotify;
    }
    }
    }
    …
    // 如果时CLeaner对象,则调用clean方法进行资源回收
    if (c != null) {
    c.clean();
    return true;
    }
    //将Reference加入到ReferenceQueue,开发者可以通过从ReferenceQueue中poll元素感知到对象被回收的事件。
    ReferenceQueue<? super Object> q = r.queue;
	    if (q != ReferenceQueue.NULL) q.enqueue(r);
	
    return true;
    }
    流程比较简单:就是源源不断的从PendingList中提取出元素,然后将其加入到ReferenceQueue中去,开发者可以通过从ReferenceQueue中poll元素感知到对象被回收的事件。
    另外需要注意的是,对于Cleaner类型(继承自虚引用)的对象会有额外的处理:在其指向的对象被回收时,会调用clean方法,该方法主要是用来做对应的资源回收,在堆外内存DirectByteBuffer中就是用Cleaner进行堆外内存的回收,这也是虚引用在java中的典型应用。
    看完了Reference的实现,再看看几个实现类里,各自有什么不同。
    SoftReference
    public class SoftReference<T> extends Reference<T> {
    static private long clock;
    private long timestamp;
    public SoftReference(T referent) {
    super(referent);
    this.timestamp = clock;
    }
    public SoftReference(T referent, ReferenceQueue<? super T> q) {
    super(referent, q);
    this.timestamp = clock;
    }
    public T get() {
    T o = super.get();
    if (o != null && this.timestamp != clock)
    this.timestamp = clock;
    return o;
    }
    }
    软引用的实现很简单,就多了两个字段:clock和timestamp.clock是个静态变量,每次GC时都会将该字段设置成当前时间。timestamp字段则会在每次调用get方法时将其赋值为clock(如果不相等且对象没被回收)。
    以上就是济南达内培训给大家做的内容详解,更多关于IT的学习,请继续关注济南达内培训