zoukankan      html  css  js  c++  java
  • 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;
     
        }
    

      

  • 相关阅读:
    树莓派安装parrot linux记录
    Arch linux(UEFI+GPT)安装及后续优化教程
    VS部分安全函数用法
    C语言博客作业06--结构体&文件
    C语言博客作业05--指针
    C语言博客作业04--数组
    C语言博客作业03--函数
    C语言博客作业02--循环结构
    DS博客作业08--课程总结
    DS博客作业07--查找
  • 原文地址:https://www.cnblogs.com/kaleidoscope/p/9878391.html
Copyright © 2011-2022 走看看