SoftReference 是 Java 中的一种引用类型,它允许 JVM 在内存不足时自动回收这些引用所指向的对象。相对于强引用(Strong Reference),使用 SoftReference 可以防止内存溢出,同时又能够保证在内存足够的情况下不会被过早地清理!
SoftReference 对象的内存回收策略和 WeakReference 很类似,但是比 WeakReference 的回收时机稍微晚一些。具体来说,当 JVM 发现一个对象只被 SoftReference 引用时,就会将该对象标记为“软可回收”的状态,但并不会立即进行回收。只有当系统内存不足且已经没有强引用指向该对象时,才会进行回收。
SoftReference 可以通过 SoftReference 类的构造函数来创建对象。例如:
```
List Object obj = new Object(); SoftReference softRef = new SoftReference(obj); softRefList.add(softRef); // 添加到集合中 ``` 在上述代码中,我们首先创建了一个对象 obj,并通过 SoftReference 将其包装成了 softRef,最后将 softRef 添加到了 softRefList 集合中。这意味着 obj 和 softRef 共同存在,并且 obj 是可达的。也就是说,如果 obj 对象没有强引用包含它,那么它将被 SoftReference 标记为“软可回收”的状态,等待系统垃圾回收器去将其回收掉。 在 Java 中,SoftReference 主要用于缓存数据、图片等较大的资源,以及系统缓存中。以 Android 为例,当移动设备的内存不足时,Android 启动一个称为“杀死进程”的操作来结束正在运行的进程。为了避免同时运行多个应用造成的内存不足,Android 会将前台应用的进程保留在内存中,而将后台应用的进程回收。在这种情况下,我们可以利用 SoftReference 来提高后台应用的数据缓存效率。 下面给出一个使用示例: ``` public class SoftReferenceExample { private static LinkedHashMap private static final long serialVersionUID = 1L; @Override protected boolean removeEldestEntry(Map.Entry if (size() >= 10) { Log.i("SoftReferenceExample", "removeEldestEntry - " + eldest.getKey()); return true; } return false; } }; public static Bitmap getBitmap(String key) { SoftReference if (softReference != null && softReference.get() != null) { Log.i("SoftReferenceExample", "getBitmap.Cache hit - " + key); return softReference.get(); } else { Log.i("SoftReferenceExample", "getBitmap.Cache miss - " + key); Bitmap bmp = loadBitmap(key); cache.put(key, new SoftReference return bmp; } } private static Bitmap loadBitmap(String key) { // 从网络或本地读取图片 return null; } } ``` 在上述代码中,我们使用 SoftReference 实现了一个简单的图片缓存操作。当调用方法 getBitmap 时,若缓存中存在对应图片则直接返回,否则从网络或本地读取图片,并将其加入缓存。在这个示例中,我们设置了缓存最大容量为 10,并在 removeEldestEntry 中实现了按 LRU(最近最少使用)策略进行回收。 总结来说,SoftReference 主要解决的是内存占用的问题,通过将未被强指向的对象标记为“软可回收”的状态,让 JVM 在内存不足时可以自动回收这些对象。使用 SoftReference 的场景通常是需要频繁存取但不需要长期持有的对象,如缓存数据、图片等较大的资源。 壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。 我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复