Java四种引用

image.png

一、综述

引用级别 回收时机 应用场景
任何时候都不会被回收(因为JVM认为被强引用的对象正在使用,如果回收的话会导致严重错误) 1,对象的一般形态;2,可能会导致内存泄漏
内存充足时:不回收;内存不足时:回收 1,可和ReferenceQueue联合使用,当软引用所引用的对象被回收后,该软引用对象会被加入到与之相关的队列中;2,联合ReferenceQueue构建有效期短/占用内存大/生命周期长的对象的二级高速缓存器
内存充足时:回收;内存不足时:回收 1,可和ReferenceQueue联合使用,当软引用所引用的对象被回收后,该软引用对象会被加入到与之相关的队列中;2,联合ReferenceQueue构建有效期短/占用内存大/生命周期长的对象的一级高速缓存器
内存充足时:回收;内存不足时:回收 可和ReferenceQueue联合使用,当虚引用所引用的对象被回收前,该虚引用对象会被加入到与之相关的队列中

二、重点解析

1.高速缓存器的雏形

前因后果:
应用中有大量默认图片(默认头像、默认图标等),在应用中许多地方都要用到。如果每次都要去读取图片的话(这是读取文件、硬件操作),速度慢,性能降低。
——> 故,考虑将图片缓存起来,每次都去内存中读取
——>又,图片占用内存大,缓存很多图片要占用很多内存,易发生OOM,故,使用软/弱引用来避免这个问题的发生

public class ImageCacheBySoftRef {
    /*
    * 缓存占用内存大、生命周期长的对象
     */
    private Map> imageCache = new HashMap<>();

    /*
    * 将对象添加到缓存中
     */
    public void addBitmapToCache(String path) {
        Bitmap bitmap = BitmapFactory.decodeFile(path);
        SoftReference softBitmap = new SoftReference(bitmap);
        imageCache.put(path, softBitmap);
    }

    /*
    * 得到缓存的对象
     */
    public Bitmap getBitmapByPath(String path) {
        SoftReference softBitmap= imageCache.get(path);
        if (softBitmap == null) {
            return null;
        }
        return softBitmap.get();
    }
}

参考文献

Android 强、软、弱、虚引用 区别和使用场景
Android校招指南

你可能感兴趣的:(Java四种引用)