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

来源:互联网 发布:淘宝如何装修手机店铺 编辑:程序博客网 时间:2024/06/08 05:42

强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

软引用是用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。

弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;class Node {    private String msg = "df";    Node(){    }    Node(String msg){        this.msg = msg;    }    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public void finalize(){          System.out.println("Finalizing ... " + msg);      } }public class Reference {    static ReferenceQueue<Node> refQueue = new ReferenceQueue<Node>();    public static void main(String[] args) {        //强引用        Node node1 = new Node();        node1.setMsg("node1");        //软引用        SoftReference<Node> node2 = new SoftReference<Node>(new Node());        node2.get().setMsg("node2");        //弱引用        WeakReference<Node> node3 = new WeakReference<Node>(new Node());        node3.get().setMsg("node3");        //虚引用        ReferenceQueue<Node> rq = new ReferenceQueue<Node>();          PhantomReference<Node> ref = new PhantomReference<Node>(new Node("node4"),rq);          System.gc();        System.out.println(node1.getMsg());        System.out.println(node2.get().getMsg());        //System.out.println(node3.get().getMsg());    }}  

运行结果如下:

结果

引用类型 被回收时间 用途 生存时间 强引用 从来不会 对象的一般状态 JVM被关闭时终止 软引用 在内存不足时 对象缓存 内存不足是终止 弱引用 在垃圾回收时 对象缓存 gc运行后终止 虚引用 Unknow Unknow Unknow
5 0
原创粉丝点击