Java 四种引用

来源:互联网 发布:淘宝发布宝贝 3c认证 编辑:程序博客网 时间:2024/06/05 03:55

Java 四种引用

强引用:

   只要引用存在,垃圾回收机制即使抛出OutOfMemor也不会进行回收

Object obj = new Object();


软引用:

当内存不足的时候,可以回收

看代码:

/** * 版权所有 (c) 2016,小明有限公司   */package helloTest;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;/** * 类说明: *  * <pre> * Modify Information: * Author        Date          Description * ============ =========== ============================ * wangxiaoming      2016-7-12    Create this file * </pre> *  */public class TestJava4Reference {    public static void main(String[] args) {        // TODO Auto-generated method stub        try {            soft();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public static void soft() throws Exception {         /*代表软引用的类:java.lang.ref.SoftReference        代表弱引用的类:java.lang.ref.WeakReference        代表虚引用的类:java.lang.ref.PhantomReference        他们同时继承了:java.lang.ref.Reference*/        //软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。       /* ReferenceQueue refQueue = new ReferenceQueue();         SoftReference softRef = new SoftReference(obj, refQueue); */        Object obj = new Object();         SoftReference<Object> softRef = new SoftReference<Object>(obj);        System.out.println(softRef.get()); //有时候会返回Null         // java.lang.Object@f9f9d8 System.out.println(refQueue.poll());        // null        // 清除强引用,触发GC                obj = null;        //System.gc();         System.out.println(softRef.get());         //Thread.sleep(200);         //System.out.println(refQueue.poll());     }}


弱引用:

/** * 版权所有 (c) 2016,小明有限公司   */package helloTest;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;import java.util.WeakHashMap;/** * 类说明: *  * <pre> * Modify Information: * Author        Date          Description * ============ =========== ============================ * wangxiaoming      2016-7-12    Create this file * </pre> *  */public class TestJava4Reference {    public static void main(String[] args) {        // TODO Auto-generated method stub        try {            soft();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public static void soft() throws Exception {         /*代表软引用的类:java.lang.ref.SoftReference        代表弱引用的类:java.lang.ref.WeakReference        代表虚引用的类:java.lang.ref.PhantomReference        他们同时继承了:java.lang.ref.Reference*/        //软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。       /* ReferenceQueue refQueue = new ReferenceQueue();         SoftReference softRef = new SoftReference(obj, refQueue); */       /* Object obj = new Object();         SoftReference<Object> softRef = new SoftReference<Object>(obj);        System.out.println(softRef.get()); //有时候会返回Null         // java.lang.Object@f9f9d8 System.out.println(refQueue.poll());        // null        // 清除强引用,触发GC                obj = null;        //System.gc();         System.out.println(softRef.get()); */        //Thread.sleep(200);         //System.out.println(refQueue.poll());                 //弱引用        Object obj = new Object();        WeakReference<Object> weakReference = new WeakReference<Object>(obj);        obj = null;        System.gc();        System.out.println(weakReference.get());// 有时候会返回Null        System.out.println(weakReference.isEnqueued());//判断是否有垃圾回收标记,表示即将回收的垃圾            }}

虚引用:

/** * 版权所有 (c) 2016,小明有限公司   */package helloTest;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;import java.util.WeakHashMap;/** * 类说明: *  * <pre> * Modify Information: * Author        Date          Description * ============ =========== ============================ * wangxiaoming      2016-7-12    Create this file * </pre> *  */public class TestJava4Reference {    public static void main(String[] args) {        // TODO Auto-generated method stub        try {            soft();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public static void soft() throws Exception {         /*代表软引用的类:java.lang.ref.SoftReference        代表弱引用的类:java.lang.ref.WeakReference        代表虚引用的类:java.lang.ref.PhantomReference        他们同时继承了:java.lang.ref.Reference*/        //软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。       /* ReferenceQueue refQueue = new ReferenceQueue();         SoftReference softRef = new SoftReference(obj, refQueue); */       /* Object obj = new Object();         SoftReference<Object> softRef = new SoftReference<Object>(obj);        System.out.println(softRef.get()); //有时候会返回Null         // java.lang.Object@f9f9d8 System.out.println(refQueue.poll());        // null        // 清除强引用,触发GC                obj = null;        //System.gc();         System.out.println(softRef.get()); */        //Thread.sleep(200);         //System.out.println(refQueue.poll());                /* //弱引用        Object obj = new Object();        WeakReference<Object> weakReference = new WeakReference<Object>(obj);        obj = null;        System.gc();        System.out.println(weakReference.get());// 有时候会返回Null        System.out.println(weakReference.isEnqueued());//判断是否有垃圾回收标记,表示即将回收的垃圾*/                // 虚引用        Object obj = new Object();        ReferenceQueue refQueue = new ReferenceQueue();        PhantomReference<Object> phantomReference = new PhantomReference<Object>(obj, refQueue);        System.out.println(phantomReference.get());  // 永远返回Null        System.out.println(phantomReference.isEnqueued()); //返回时否从队列中删除    }}


0 0
原创粉丝点击