内存优化:SoftReference 和 WeakReference 软引用与弱引用

来源:互联网 发布:学德语的软件 编辑:程序博客网 时间:2024/05/24 06:54

 java.lang.ref.SoftReference

SoftReference 在“弱引用”中属于最强的引用。SoftReference 所指向的对象,当没有强引用指向它时,会在内存中停留一段的时间,垃圾回收器会根据 JVM 内存的使用情况(内存的紧缺程度)以及 SoftReference 的 get() 方法的调用情况来决定是否对其进行回收。

具体使用一般是通过 SoftReference 的构造方法,将需要用弱引用来指向的对象包装起来。当需要使用的时候,调用 SoftReference 的 get() 方法来获取。当对象未被回收时 SoftReference 的 get() 方法会返回该对象的强引用。如下:

 SoftReference<Bean> bean = new SoftReference<Bean>(new Bean("name", 10));  System.out.println(bean.get());// “name:10“
软引用有以下特征:
软引用使用 get() 方法取得对象的强引用从而访问目标对象。
软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。
软引用可以避免 Heap 内存不足所导致的异常。

当垃圾回收器决定对其回收时,会先清空它的 SoftReference,也就是说 SoftReference 的 get() 方法将会返回 null,然后再调用对象的 finalize() 方法,并在下一轮 GC 中对其真正进行回收。

java.lang.ref.WeakReference

WeakReference 是弱于 SoftReference 的引用类型。弱引用的特性和基本与软引用相似,区别就在于弱引用所指向的对象只要进行系统垃圾回收,不管内存使用情况如何,永远对其进行回收(get() 方法返回 null)。
完全可以通过和 SoftReference 一样的方式来操作 WeakReference,这里就不再复述。
弱引用有以下特征:
弱引用使用 get() 方法取得对象的强引用从而访问目标对象。
一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
弱引用也可以避免 Heap 内存不足所导致的异常。

总结:

引用类型===取得目标对象方式===垃圾回收条件===是否可能内存泄漏
强引用       直接调用                 不回收                  不可能
软引用       通过 get() 方法        视内存情况回收    不可能
弱引用       通过 get() 方法        永远回收               不可能

调用方法:

 A obj = new A();

    WeakReference wr = new WeakReference(obj);

    obj = null;

    //等待一段时间,obj对象就会被垃圾回收
  
  ...

  if (wr.get()==null) { 
  
  
  System.out.println("obj 已经被清除了 "); 
  
  
  } else { 
  
  System.out.println("obj 尚未被清除,其信息是 "+obj.toString());
  
  }


==============================================================

    A obj = new A();

    SoftRefenrence sr = new SoftReference(obj);

 

    引用时

    if(sr!=null){

        obj = sr.get();

    }else{

        obj = new A();

        sr = new SoftReference(obj);

    }



原创粉丝点击