java 四种引用

Java中引用存储的是对一块内存地址的起始地址。除此之外,jdk另外还提供了四种引用:强引用、软引用、弱引用、虚引用来分别表示不同场景下回收的引用,更加丰富。

一、强引用

强引用是我们平时使用最多的引用,通过“obj = new Object()”这种创建的就是强引用。只要强引用还存在,垃圾回收器就不会回收这个引用。
何时会回收强引用呢?
1.手工置为null,jvm进行垃圾回收。
2.对象生存期到了。比如方法内的局部变量在退出方法后,jvm进行垃圾回收。

public class MyObject {
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("被回收");
    }
}

1.强引用显示回收:

    public void testRefrence(){
        MyObject obj = new MyObject();
        System.out.println(obj);
        obj = null;
        System.out.println(obj);
        System.gc();
    }

运行结果:

com.yannic.road.service.MyObject@17579e0f
null
被回收

虽然obj置为null了,但是jvm没有进行垃圾回收,所以此时还没有回收掉这个强引用。
2.强引用隐式回收

/**
     * 为了消耗大量内存,触发jvm垃圾回收
     */
    public void drainMemory(){
        String[] array = new String[1024 * 100];
        for(int i = 0; i < 1024 * 100; i++) {
            for(int j = 'a'; j <= 'z'; j++) {
                array[i] += (char)j;
            }
        }
    }

    public void methodA(){
        MyObject obj = new MyObject();
    }

    @Test
    public void testRefrence(){
        methodA();
        //触发jvm垃圾回收
        drainMemory();
    }

运行结果:

被回收

obj在方法退出后,就不再指向new MyObject()所在的内存了。

二、软引用

软引用是只有jvm内存不够时,才会被垃圾回收。也就是内存足够时,和强引用是一样的。

  MyObject obj = new MyObject();
  SoftReference reference = new SoftReference(obj);

软引用一般用于对于内存敏感的场景。

三、弱引用

弱引用就是不管内存是否足够,只要发生垃圾回收,弱引用就会被回收。

    public void testRefrence(){
        MyObject obj = new MyObject();
        WeakReference reference = new WeakReference(obj);
        obj = null;
        System.gc();
    }

运行结果:

被回收

弱引用适用于那些临时需要缓存的数据,一旦内存不够被回收也没有什么影响。

四、虚引用

虚引用就是无引用,使对象无引用。

    public void testRefrence(){
        MyObject obj = new MyObject();
        ReferenceQueue queue = new ReferenceQueue();
        PhantomReference ref = new PhantomReference(obj, queue);
    }

你可能感兴趣的:(java 四种引用)