JVM-引用

2020-03-11  本文已影响0人  GIT提交不上

  Java引用类结构如下所示:

图1-1 Java引用.png 图1-2 JVM引用.png

  强引用:就算出现OOM也不对该对象进行回收,不进行GC。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        Object obj2 = obj1;
        obj1 = null;
        System.gc();
        System.out.println(obj2);
    }
}

  软引用:系统内存充足时不会被回收,反正则会被回收。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        SoftReference<Object> softReference = new SoftReference<>(obj1);

        System.out.println(obj1);
        System.out.println(softReference.get());

        obj1 = null;
        //-Xms5m -Xmx5m
        try {
            Byte[] bytes = new Byte[10*1024*1024];
        }finally {
            System.out.println(obj1);
            System.out.println(softReference.get());
        }
    }
}

  弱引用:只要垃圾回收机制一运行,不管JVM内存空间是否足够,都会回收该对象占用的内存。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        WeakReference<Object> weakReference = new WeakReference<>(obj1);

        System.out.println(obj1);
        System.out.println(weakReference.get());

        obj1 = null;
        System.gc();

        System.out.println(obj1);
        System.out.println(weakReference.get());
    }
}

  软引用,弱引用:适用缓存。

图1-3 软引用 & 弱引用试用场景.png

  WeakHashMap示例代码如下:

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        WeakHashMap<Integer,String> weakHashMap = new WeakHashMap<>();
        //Integer key = 2;
        Integer key = new Integer(2);
        String value = "luffy";
        weakHashMap.put(key,value);
        System.out.println(weakHashMap);
        key = null;
        System.out.println(weakHashMap);
        System.gc();
        System.out.println(weakHashMap);
    }
}

  虚引用:如果一个对象仅持有虚引用,无任何引用,虚引用的get方法总是返回null,任何时候都可能被GC,GC时被放入引用队列。

/**
 * @author luffy
 **/
public class ReferenceDemo {
    public static void main(String[] args){
        Object obj1 = new Object();
        //通知机制
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj1,referenceQueue);

        System.out.println(obj1);

        System.out.println(phantomReference.get()); //总返回null
        System.out.println(referenceQueue.poll());

        obj1 = null;
        System.gc();
        System.out.println("======================================");
        System.out.println(obj1);
        System.out.println(phantomReference.get()); //总返回null
        System.out.println(referenceQueue.poll());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读