java之强、软、弱、虚四大引用

强引用

强引用就是普通的对象引用:

        String s = "string";
        Integer i = new Integer(1);

s和i都是一个强引用,强引用指向的对象GC无论如何都不会回收,它宁可抛出OOM(out of memory)。

软引用

软引用需要指明:

        String s = "string";
        SoftReference softS = new SoftReference(s);

softS即为指向”string”这个字符串对象的软引用。软引用指向的对象只有在内存不足时才会被GC回收,这里有个前提,没有任何强引用指向这个对象,仅有软引用指向这个对象上述情况才有意义。比如上面的代码:如果s定义在方法内部,那么s这个强引用在运行栈上,方法结束这个强引用也就没有了,但如果s定义成类变量,那么这个引用就不是在栈上(在堆或方法区中),这时就算有softS这个软引用也是没用的,内存不足时也不会被回收。

弱引用

弱引用同样需要指明:

        String s = "string";
        WeakReference weakS = new WeakReference(s);

仅有弱引用指向的对象,会被GC果断回收。

虚引用

虚引用定义如下:

        String s = "string";
        PhantomReference phantomS = new PhantomReference(s, new ReferenceQueue<PhantomReference>());

构造方法多了一个参数,引用队列。仅有虚引用指向的对象几乎等于没有引用指向这个对象,会被GC非常果断的回收,如果虚引用指向的对象被GC回收,GC就会把这个虚引用加入队列。软引用和弱引用同样由此过程,如果软引用和弱引用指向的对象被回收,GC就会把他们加入队列(如果引用队列存在的话)。

软引用的一个常用场景

用来实现缓存,比如一个应用要大量读取本地图片,如果这些图片都放在外存里,读取效率会非常的低下,如果都在内存里,太占内存容量,容易溢出。这时软引用就派上用场了,当内存不够时,GC就会回收一部分(或全部)图片,以解放内存。
下面代码摘自:
http://blog.csdn.net/arui319/article/details/8489451

....
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
<br>....
public void addBitmapToCache(String path) {

        // 强引用的Bitmap对象

        Bitmap bitmap = BitmapFactory.decodeFile(path);

        // 软引用的Bitmap对象

        SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);

        // 添加该对象到Map中使其缓存

        imageCache.put(path, softBitmap);

    }

 public Bitmap getBitmapByPath(String path) {

        // 从缓存中取软引用的Bitmap对象

        SoftReference<Bitmap> softBitmap = imageCache.get(path);

        // 判断是否存在软引用

        if (softBitmap == null) {

            return null;

        }

        // 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空

        Bitmap bitmap = softBitmap.get();

        return bitmap;

    }

猜你喜欢

转载自blog.csdn.net/nvnnv/article/details/51464921