美文网首页
Java四种引用模式在Android种的应用

Java四种引用模式在Android种的应用

作者: Android__Tower | 来源:发表于2019-04-11 23:08 被阅读0次

    Java中的引用一共有四种:强引用、软引用、弱引用 和 虚引用。下面来分别说一下这四种引用的用法及区别。

    强引用(StrongReference)

    是指创建一个对象并把这个对象赋给一个引用变量。
    比如:
    String str ="StrongReference";

        /**
         * 强引用(StrongReference)
         * 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,
         * 即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象
         *
         */
        public static void funStrongReference() {
    
            String str="StrongReference";
    
        }
    

    软引用(SoftReference)

    如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
    如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
    在Android中,软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。
    SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。

        /**
         * 软引用(SoftReference)
         * 对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象
         *
         *
         */
        public static void funSoftReference() {
            SoftReference<String> str = new SoftReference<String>(new String("funSoftReference"));
            System.out.println(str.get());
            //通知JVM进行内存回收
            System.gc();
            System.out.println(str.get());
    
        }
    
    

    运行代码

       public static void main(String[] args) {
            funSoftReference();
    //        funWeakReference();
    //        funPhantomReference();
    
        }
    
    运行后得到结果: 软引用.png

    弱引用(WeakReference)

    弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
    在Android中,常常使用弱引用来解决内存泄漏的问题,例如handler持有了一个Activity的引用,当这个Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,所以导致该Activity的内存资源无法及时回收,引发内存泄漏。解决办法是让handler持有一个activity的弱引用。

        /**
         * 弱引用(WeakReference)
         * 当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。
         * eg:在Android中,存在内存泄漏
         *
         */
        public static void funWeakReference() {
            WeakReference<String> str = new WeakReference<String>(new String("funWeakReference"));
            System.out.println(str.get());
            //通知JVM进行内存回收
            System.gc();
            System.out.println(str.get());
        }
    

    运行代码:

        public static void main(String[] args) {
    
    //        funSoftReference();
            funWeakReference();
    //        funPhantomReference();
    
        }
    
    

    得到结果:


    弱引用.png

    虚引用(PhantomReference)

    虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
      要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

        /**
         * 虚引用(PhantomReference)
         * 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,
         * 即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象
         *
         */
        public static void funPhantomReference() {
            ReferenceQueue<String> queue = new ReferenceQueue<>();
            PhantomReference<String> str = new PhantomReference<String>("funPhantomReference", queue);
            System.out.println(str.get());
        }
    

    运行代码:

        public static void main(String[] args) {
    
    //        funSoftReference();
    //        funWeakReference();
            funPhantomReference();
    
        }
    
    

    得到结果:


    虚引用.png

    相关文章

      网友评论

          本文标题:Java四种引用模式在Android种的应用

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