android面试题 谈谈强 软 弱 虚引用

首先看类的结构图:

android面试题 谈谈强 软 弱 虚引用_第1张图片t

它是在java.lang.ref包下 从上面的单词就知道了Reference是引用的意思,前面的前缀就是所说的软  弱 虚引用,我们通常都是使用强引用,

 Person person = new Person();

Java默认就是强引用,比如上面的new Peson对象,

强引用的特点:

当内存不足, jvm开始垃圾回收,对于强引用的对象,就算出现OOM异常也不会对该对象进行回收,Android内存泄露大部分都是强引用导致的,

 Object object1 = new Object();
        Object object2 = object1;
        object1 = null;
        System.gc();
        System.out.println("object2="+object2);

虽然把object1=null,然后object2还是存在,

软引用特点:

软引用是相对强引用弱点的引用,需要使用SoftReference类来实现,当系统内存充足时,它不会被回收,当系统内存不足时,它会被回收,软引用通常使用在对内存比较敏感时使用

 Object object1 = new Object();
       SoftReference softReference = new SoftReference<>(object1);

       object1=null;
       System.gc();
       System.out.println("object1="+object1);
       System.out.println("强引用-->"+softReference.get());

从上面的代码虽然我把object1=null了,但是从软引用中获取的对象还是不为null,这就是证明了在内存足够时候,不会回收,我把内存配置成了10m


        Object object1 = new Object();
       SoftReference softReference = new SoftReference<>(object1);
       object1 = null;
       try {
           byte[] bytes = new byte[10*1024*1024];
       }catch (Exception e){
       }finally {
           System.out.println("object1="+object1);
           System.out.println("强引用-->"+softReference.get());
       }

这个时候会报:

android面试题 谈谈强 软 弱 虚引用_第2张图片

这就证明了内存不足时候,会回收软引用的对象

弱引用特点:

弱引用需要用WeakReference来实现,它比软引用的生存期更短.不管内存是否够用,只要gc扫描到它都会被回收.代码演示:

   Object object1 = new Object();
       WeakReference weakReference = new WeakReference<>(object1);
       System.out.println("object1="+object1);
        System.out.println("弱引用中的对象="+weakReference.get());
       object1 = null;
       System.gc();
       System.out.println("回收后-----------");
        System.out.println("object1="+object1);
        System.out.println("弱引用中的对象="+weakReference.get());

虚引用特点:

虚引用是使用PhantomReference类实现,做了这么多年开发 没用到过,不知道它的使用场景在哪里,如果一个对象仅持有虚引用,

那么它就和没任何引用一样,在任何时候都有可能被垃圾回收, 它不能单独使用也不能通过它访问对象,虚引用必须配合ReferenceQueue一起使用,虚引用的作用主要是跟踪对象被垃圾回收的状态,

 

ReferenceQueue

这个类的作用就是对象被垃圾回收后会存放到引用队列中,

Object object1 = new Object();
        ReferenceQueue referenceQueue = new ReferenceQueue();
        WeakReference weakReference = new WeakReference<>(object1,referenceQueue);
        System.out.println("回收前获取引用队列中的对象"+referenceQueue.poll());
        object1 = null;
        System.gc();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("回收后获取引用队列中的对象"+referenceQueue.poll());

结果:

回收前获取引用队列中的对象null
回收后获取引用队列中的对象java.lang.ref.WeakReference@610455d6

就写到这里吧!

你可能感兴趣的:(android,java基础,面试题)