手机版
你好,游客 登录 注册
背景:
阅读新闻

Java 软引用和弱引用

[日期:2019-06-20] 来源:Linux社区  作者:kaleidoscope [字体: ]

软引用(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;
 
    }

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-06/159109.htm

linux
相关资讯       Java软引用  Java弱引用 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款