美文网首页
java 四种引用

java 四种引用

作者: 归来依旧少女 | 来源:发表于2019-07-18 15:40 被阅读0次

    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 四种引用

          本文链接:https://www.haomeiwen.com/subject/hsdihctx.html