四 强/软/弱/虚 引用

2018-11-22  本文已影响0人  BeYearn
  1. 四种引用, 除了基本数据类型外,其他的都是指向各类对象的对象引用
String str=new String("abc");     // 强引用
 SoftReference<String> softRef=new SoftReference<String>(str);     // 软引用
str = null;
System.out.println(softRef.get());  //abc
//小例子
Browser prev = new Browser();               // 获取到的页面内容
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用,其可达状态变为soft
if(sr.get()!=null){ 
    rev = (Browser) sr.get();           // 之后再查看 还没有被回收器回收,直接获取
}else{
    prev = new Browser();               // 由于内存吃紧,所以对软引用的对象回收了
    sr = new SoftReference(prev);       // 重新构建
}
  1. 所有引用类型都是抽象类java.lang.ref.Reference的子类 它提供了get方法, 返回引用指向的对象. 除了幻象引用(其get永远返回null), 如果对象还没被回收, 都可以通过get方法获取原有对象. 这意味这我们可以以此将软引用弱引用访问到的对象重新指向为强引用, 人为改变可达性状态. 但如果我们错误的保持了强引用(比如赋值给了一个static变量), 那么对象可能就不再有机会变为类似弱引用的状态了, 本来该回收的就不能回收, 即产生内存泄漏

  2. 引用队列
    Reference类构造函数提供了一个ReferenceQueue类型的参数传入,通过提供这个参数,我们便把创建的弱引用对象注册到了一个引用队列上,这样当它被垃圾回收器清除时,就会把它送入这个引用队列中,我们便可以对这些被清除的弱引用对象进行统一管理。

public class ReferenceTest {
 
    private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<VeryBig>();
 
    public static void checkQueue() {
        Reference<? extends VeryBig> ref = null;
        while ((ref = rq.poll()) != null) {
            if (ref != null) {
                System.out.println("In queue: " + ((VeryBigWeakReference) (ref)).id);
            }
        }
    }
 
    public static void main(String args[]) {
        int size = 3;
        LinkedList<WeakReference<VeryBig>> weakList = new LinkedList<WeakReference<VeryBig>>();
        for (int i = 0; i < size; i++) {
            weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq));
            System.out.println("Just created weak: " + weakList.getLast());
 
        }
 
        System.gc(); 
        try { // 下面休息几分钟,让上面的垃圾回收线程运行完成
            Thread.currentThread().sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        checkQueue();
    }
}
 
class VeryBig {
    public String id;
    // 占用空间,让线程进行回收
    byte[] b = new byte[2 * 1024];
 
    public VeryBig(String id) {
        this.id = id;
    }
 
    protected void finalize() {
        System.out.println("Finalizing VeryBig " + id);
    }
}
 
class VeryBigWeakReference extends WeakReference<VeryBig> {
    public String id;
 
    public VeryBigWeakReference(VeryBig big, ReferenceQueue<VeryBig> rq) {
        super(big, rq);
        this.id = big.id;
    }
 
    protected void finalize() {
        System.out.println("Finalizing VeryBigWeakReference " + id);
    }
}
//结果
Just created weak: VeryBigWeakReference@63961c42
Just created weak: VeryBigWeakReference@65b54208
Just created weak: VeryBigWeakReference@1be6f5c3
Finalizing VeryBig Weak 2
Finalizing VeryBig Weak 1
Finalizing VeryBig Weak 0
In queue: Weak 1
In queue: Weak 2
In queue: Weak 0
  1. 对象可达性流转分析


    图片.png
上一篇下一篇

猜你喜欢

热点阅读