关于softreference与weakreference在android中进行图片加载解决缓存和内存溢出的详解

找到组织 发布于 2013/05/08 13:13
阅读 2K+
收藏 1

最近在想关于softreference与weakreference在移动设备上的用途自己总结了几点,与大家共享一下,同时欢迎大家积极讨论:

首先普及一下

软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
  弱引用(WeakReference)
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

SoftReference的语义就是当内存不够用的时候,GC回收SoftReference所引用的对象。所以,在memory sensitive的程序中将某些大型数据设置成SoftReference还是比较合适的。但是在缓存完了要使用的时候也要注意,在

Object obj1;    
    obj1 = sr.get();    
    if (obj1 == null) // GC freed this    
    sr = new SoftReference(obj1 = new Object());  

因为是SoftReference,所以有可能已经被GC回收了,所以需要判断sr.get()的返回值是否为null。如果是的话,就再重新new一个Object。这里的最后一行代码也很有讲究,比如,也许会这么写:
Java代码  收藏代码

    Object obj2;    
    obj2 = sr.get();    
    if (obj2 == null) {    
        sr = new SoftReference(new Object());    
        obj2 = sr.get();    
    }   

这样的问题就在于GC可能发生在"sr = new SoftReference(new Object());"和"obj2 = sr.get()"之间,那么obj2仍然有可能为null,好了今天就先写这些,欢迎大家讨论啊

加载中
返回顶部
顶部