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);
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容