Java对象的强软弱虚四种引用的作用与回收

来源:互联网 发布:淘宝开店认证2张银行卡 编辑:程序博客网 时间:2024/04/28 06:33

Java对引用的分类有 Strong reference, SoftReference, WeakReference, PhatomReference 四种。
这里写图片描述
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。

软/弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。利用这个队列可以得知被回收的软/弱引用的对象列表,从而为缓冲器清除已失效的软/弱引用。

假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软/弱引用技术来避免这个问题发生。以下就是高速缓冲器的雏形:

首先定义一个HashMap,保存软引用对象。

private Map <String, SoftReference<Bitmap>> imageCache = new HashMap <String, SoftReference<Bitmap>> ();

再来定义一个方法,保存Bitmap的软引用到HashMap。

public class CacheBySoftRef {    //首先定义一个HashMap,保存软引用对象    private Map<String,SoftReference<Bitmap>> imageCache=new HashMap<>();    /**     * 再来定义一个方法,保存Bitmap的软引用到HashMap     */    public void addBitmapToCache(String path){        //强引用的Bitmap对象        Bitmap bitmap= BitmapFactory.decodeFile(path);        //软引用的Bitmap对象        SoftReference<Bitmap> softBitmap=new SoftReference<Bitmap>(bitmap);        //添加该对象到Map中使其缓存        imageCache.put(path,softBitmap);    }    /**     * 获取的时候,可以通过SoftReference的get()方法得到Bitmap对象     * @param path     * @return     */    public Bitmap getBitmapByPath(String path){        //从缓存中取软引用的Bitmap对象        SoftReference<Bitmap> softBitmap=imageCache.get(path);        //判断是否存在软引用        if (softBitmap==null){            return null;        }        //通过软引用取出Bitmap对象,如果由于内存不足Bitmap被回收,将返回null,        // 如果未被回收,则可以重复使用,提高速度        Bitmap bitmap=softBitmap.get();        return bitmap;    }}

使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。

如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。

另外可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。

0 0
原创粉丝点击