软引用

Java从JDK1.2之后就将对象的引用分为4个级别:强引用、软引用、弱引用、虚引用。具体的概念不详述了。

软引用:当内存空间足够的时候,GC就不会回收它,内存空间不足了,就会回收。

弱引用:GC工作过程中,一旦发现了弱引用对象,不管内存足够与否,都会回收它的内存。

所以,从上述可以看出,软引用和弱引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。

当缓存大量的Bitmap时,比较容易造成OOM,所以可以考虑使用软引用技术来避免这个问题的发生。

01 //首先定义一个HashMap,保存软引用对象
02 private Map<string, SoftReference<Bitmap>> imageCache =
03    new HashMap<String, SoftReference<Bitmap>>();
04 //保存Bitmap的软引用到HashMap
05 public void addBitmapToCache(String path) {
06    //强引用的Bitmap对象
07   Bitmap bitmap = BitmapFactory.decodeFile(path);
08   //软引用的Bitmap对象
09   SoftReference<Bitmap> softBitmap =
10    new SoftReference<Bitmap>(bitmap);
11   //添加该对象到map中使其缓存
12    imageCache.add(path, softBitmap);
13 }
14  
15 //获取缓存对象
16 public Bitmap getBitmapByPath(String path) {
17   //从缓存中取软引用的Bitmap对象
18   SoftReference<Bitmap> softBitmap = imageCache.get(path);
19   //判断是否存在软引用
20   if(softBitmap == null) {
21     return null;
22   }
23 //取出Bitmap对象,如果内存不足Bitmap被回收,将取得空
24   Bitmap bitmap = softBitmap.get();
25   return bitmap;
26 }

使用软引用之后,在OOM异常发生之前,这些缓存的图片资源空间都会被释放掉,从而可以避免程序因为OOM而Crash。

什么时候使用软引用,什么时候使用弱引用?

建议:如果只想避免OOM,则使用软引用;如果该对象经常被使用,则使用软引用;如果想尽快回收一些占用内存比较大的对象,则使用弱引用;

### Android 中 `SoftReference` 的使用方法及场景 #### 软引用的概念 软引用 (`SoftReference`) 是 Java 提供的一种特殊类型的引用,在内存充足的情况下不会被回收,只有当 JVM 内存不足时才会被回收。这使得软引用于缓存机制特别有用,因为即使对象不再有强引用指向它,只要内存允许,该对象仍然可以保留。 #### 创建和使用 `SoftReference` 创建一个 `SoftReference` 对象非常简单: ```java import java.lang.ref.SoftReference; // 假设 bitmap 是要存储的对象 Bitmap bitmap = ... ; SoftReference<Bitmap> softRef = new SoftReference<>(bitmap); ``` 通过上述方式创建了一个指向 `bitmap` 的软引用。如果想要访问这个 `bitmap` 只需调用 `softRef.get()` 方法即可[^1]。 #### 应用场景分析 ##### 缓存实现 由于软引用的特点是在内存紧张的时候会被优先清理掉,所以非常适合做本地图片或其他资源文件的缓存处理。比如在一个应用里加载大量图片时,为了避免频繁读取磁盘造成性能瓶颈,可以先将这些图片放入到基于软引用构建起来的记忆体缓存中去。一旦发生OOM异常之前,JVM会自动释放这部分空间来缓解压力[^4]。 ##### 防止内存泄露 对于某些生命周期较长且持有较大对象的情况(如 Activity 或 Fragment),如果不小心造成了内部类对外部类的隐式引用,则可能导致严重的内存泄漏现象。此时可以通过采用软引用来间接保持对该大对象的引用关系,从而降低因长时间占用过多堆内存量而引发崩溃的风险[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值