一、综述
引用级别 | 回收时机 | 应用场景 |
---|---|---|
强 | 任何时候都不会被回收(因为JVM认为被强引用的对象正在使用,如果回收的话会导致严重错误) | 1,对象的一般形态;2,可能会导致内存泄漏 |
软 | 内存充足时:不回收;内存不足时:回收 | 1,可和ReferenceQueue联合使用,当软引用所引用的对象被回收后,该软引用对象会被加入到与之相关的队列中;2,联合ReferenceQueue构建有效期短/占用内存大/生命周期长的对象的二级高速缓存器 |
弱 | 内存充足时:回收;内存不足时:回收 | 1,可和ReferenceQueue联合使用,当软引用所引用的对象被回收后,该软引用对象会被加入到与之相关的队列中;2,联合ReferenceQueue构建有效期短/占用内存大/生命周期长的对象的一级高速缓存器 |
虚 | 内存充足时:回收;内存不足时:回收 | 可和ReferenceQueue联合使用,当虚引用所引用的对象被回收前,该虚引用对象会被加入到与之相关的队列中 |
二、重点解析
1.高速缓存器的雏形
前因后果:
应用中有大量默认图片(默认头像、默认图标等),在应用中许多地方都要用到。如果每次都要去读取图片的话(这是读取文件、硬件操作),速度慢,性能降低。
——> 故,考虑将图片缓存起来,每次都去内存中读取
——>又,图片占用内存大,缓存很多图片要占用很多内存,易发生OOM,故,使用软/弱引用来避免这个问题的发生
public class ImageCacheBySoftRef {
/*
* 缓存占用内存大、生命周期长的对象
*/
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<>();
/*
* 将对象添加到缓存中
*/
public void addBitmapToCache(String path) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
imageCache.put(path, softBitmap);
}
/*
* 得到缓存的对象
*/
public Bitmap getBitmapByPath(String path) {
SoftReference<Bitmap> softBitmap= imageCache.get(path);
if (softBitmap == null) {
return null;
}
return softBitmap.get();
}
}