NOTE

7.17 引用

1. 强软弱虚引用 1.1. 强 最普遍的引用。一个对象具有强引用,那么绝不会被回收。 - 例子 1.2. 软 内存足够的时候不会被回收,不足的时候会被回收。 使用SoftReference实现,一般用于缓存 - 例子 1.3. 弱 不管内存是否充足,一旦发生gc就会被回收 1.4. 虚 监控GC回

Java创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 强软弱虚引用

1.1. 强

最普遍的引用。一个对象具有强引用,那么绝不会被回收。

  • 例子
Object object = new Object();
System.out.println(object);//java.lang.Object@1b6d3586

System.gc();

System.out.println(object);//java.lang.Object@1b6d3586

1.2. 软

内存足够的时候不会被回收,不足的时候会被回收。 使用SoftReference实现,一般用于缓存

  • 例子
//内存充足的情况
    public static void softRefMemoryEnough()
    {
        Object obj1 = new Object();
        SoftReference<Object> softReference  = new SoftReference<>(obj1);

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

        obj1 = null;
        System.gc();//触发gc

        System.out.println(obj1);
        System.out.println(softReference.get());//软引用不会被回收
    }

    //内存不足的情况
    //-Xms10m -Xmx10m -XX:+PrintGCDetails
    public static void softRefMemoryNotEnough()
    {
        Object obj1 = new Object();
        SoftReference<Object> softReference  = new SoftReference<>(obj1);

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

        obj1 = null;

        try
        {
            byte[] bytes = new byte[1024 * 1024 * 30];
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            System.out.println(obj1);
            System.out.println(softReference.get());//软引用会被回收
        }


    }

1.3. 弱

不管内存是否充足,一旦发生gc就会被回收

public static void weakRefMemoryEnough()
    {
        Object obj1 = new Object();
        WeakReference<Object> softReference  = new WeakReference<>(obj1);

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

        obj1 = null;
        System.gc();

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

1.4. 虚

监控GC回收,没什么用。 虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

public static void xuTest() throws InterruptedException
    {
        Object object = new Object();
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        PhantomReference<Object> phantomReference = new PhantomReference<>(object, queue);
        System.out.println(object);
        System.out.println(phantomReference.get());
        System.out.println(queue.poll());


        System.out.println("-================");

        object = null;
        System.gc();

        Thread.sleep(50);

        System.out.println(object);
        System.out.println(phantomReference.get());
        System.out.println(queue.poll());

    }

1.4.1. 使用场景

  • WeakHashMap
public static void hashMapTest()
{
    HashMap<Integer, String> map = new HashMap<>();
    Integer key = new Integer(1);

    map.put(key, "aaaaaaaaaa");

    System.out.println(map);

    key = null;
    System.gc();
    System.out.println(map);
}

public static void weakHashMapTest()
{
    WeakHashMap<Integer, String> map = new WeakHashMap<>();
    Integer key = new Integer(1);
    map.put(key, "aaaaaaaaaa");

    System.out.println(map);

    key = null;
    System.gc();
    System.out.println(map);
}

2. 参考链接