java强引用、弱引用、软引用、虚引用

类别:java  阅读:274  发布时间:Mon Jan 08 23:53:46 CST 2018

    强引用就是普通的 new Obect() 方式

Object obj = new Object()

    使用 WeakReference 可以得到一个弱引用,弱引用可以通过 get() 拿到真实的依赖对象(str)。但当弱引用实例依赖的对象(str)被销毁, get() 将 return null.

public static void main(String[] args) {
    String str = new String("test");
    WeakReference<String> weakReference = new WeakReference<>(str, referenceQueue);
    System.out.println(str);
    System.out.println("weakReference.get():" + weakReference.get());
    str = null;
    System.gc();
    System.out.println(weakReference.get());
}

输出:
test
weakReference.get():test
null

    弱引用可配合 ReferenceQueue 使用,当弱引用指向的真实对象被回收时,那么这个引用对象就会进入 ReferenceQueue ,通过操作 ReferenceQueue 就可以知道某个对象是否已经被 GC 回收掉。

public static void main(String[] args) {
    String str = new String("test");
    ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
    WeakReference<String> weakReference = new WeakReference<>(str, referenceQueue);
    System.out.println(str);
    System.out.println("weakReference.get():" + weakReference.get());
    str = null;
    System.gc();
    System.out.println(weakReference.get());
    System.out.println(referenceQueue.poll());
}

test
weakReference.get():test
null
java.lang.ref.WeakReference@5aaa6d82

    软引用和弱引用差不多,区别是,软引用指向的实例对象在 jvm 内存不足的时候,才会被 GC 回收。

    虚引用指向的对象十分脆弱,get() 永远都返回 null,它的作用是当它依赖的对象被 GC 回收时,它自己被加入到 ReferenceQueue 

关键字:强引用 弱引用 软引用 虚引用

© copyright 粤ICP备16108162号-1