• Java 软引用和弱引用


    软引用(SoftReference)

      软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

    弱引用(WeakReference)

      弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示

    虚引用(PhantomReference)

      虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

    如何利用软引用和弱引用解决OOM问题

    下面举个例子,假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。

      设计思路是:用一个HashMap来保存图片的路径 和 相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。在Android开发中对于大量图片下载会经常用到。

    private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
    
       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;
     
        }
    

      

  • 相关阅读:
    sql in not in 案例用 exists not exists 代替
    根据算法规则进行匹配相似车辆
    随机生成临时车牌号
    无法加载 DLL“ParkCOM.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E) 终结者
    c# 除掉前三个字符,剩下的4个字符全为数字方为特殊车辆
    UI设计文本框解决Placeholder的在IE10 以下 IE 9 IE8 IE 7 的兼容问题
    EF框架 对字段属性为NULL的空值处理 类型前面加上?保证EF列表读取显示数据不会报异常
    boost::property_tree读取解析.xml文件
    C++ URLencode library
    http与中文编码传输
  • 原文地址:https://www.cnblogs.com/kaleidoscope/p/9878391.html
Copyright © 2020-2023  润新知