Java基础

Java——软引用、弱引用应用

2018-07-31  本文已影响34人  黄金矿工00七
软引用(Soft Reference)

表示一个对象处在有用但非必须的状态。如果一个对象只具有软引用,在内存空间充足时,GC就不会回收该对象;当内存空间不足时,GC会回收该对象的内存(回收发生在OutOfMemoryError之前)。

public static void main(String[] args) {
         
        SoftReference<Cache > sr = new SoftReference<Cache >(new Cache ());
        System.out.println(sr.get());
    }

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被GC回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中,以便在恰当的时候将该软引用回收。但是由于GC线程的优先级较低,通常手动调用System.gc()并不能立即执行GC,因此弱引用所引用的对象并不一定会被马上回收。

弱引用(Weak Reference)

用来描述非必须的对象。它类似软引用,但是强度比软引用更弱一些:弱引用具有更短的生命.GC在扫描的过程中,一旦发现具有被弱引用关联的对象,都会回收掉被弱引用关联的对象。换言之,无论当前内存是否紧缺,GC都将回收被弱引用关联的对象。

 WeakReference<Cache > wr = new WeakReference<Cache >(new Cache ());

同样弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被GC回收了,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中,以便在恰当的时候将该弱引用回收。

ReferenceQueue
/**
 * Reference queues, to which registered reference objects are appended by the
 * garbage collector after the appropriate reachability changes are detected.
 */
ReferenceQueue< Cache > rq=new ReferenceQueue();
WakeReference <Cache>wr=new WakeReference(new Cache (),rq);

需要注意的是如果是显示声明的对象,如下图所示,如果不置为null,那么永远存在一个指向该对象的强引用,如下图,将不会对该对象进行回收

  Cache cache = new Cache();
    ReferenceQueue<Cache> referenceQueue = new ReferenceQueue();
    WeakReference wr = new WeakReference(cache, referenceQueue);
    //cache = null;
    System.gc();
image.png

所以显示声明一个需要软引用或者弱引用的对象时,要设置为null,取消对他的强引用,才会在GC时回收

ReferenceQueue< Cache > rq=new ReferenceQueue();
Cache cache = new Cache ();
WakeReference wr=new WakeReference(cache ,rq);
cache = null;
System.gc();
应用场景

两者都可以实现缓存功能,但软引用实现的缓存通常用在服务端,而在移动设备中的内存更为紧缺,对垃圾回收更为敏感,因此android中的缓存通常是用弱引用来实现(比如LruCache)

上一篇 下一篇

猜你喜欢

热点阅读