SoftReference 介绍

SoftReference 是 Java 中的一种引用类型,它允许 JVM 在内存不足时自动回收这些引用所指向的对象。相对于强引用(Strong Reference),使用 SoftReference 可以防止内存溢出,同时又能够保证在内存足够的情况下不会被过早地清理!

SoftReference 对象的内存回收策略和 WeakReference 很类似,但是比 WeakReference 的回收时机稍微晚一些。具体来说,当 JVM 发现一个对象只被 SoftReference 引用时,就会将该对象标记为“软可回收”的状态,但并不会立即进行回收。只有当系统内存不足且已经没有强引用指向该对象时,才会进行回收。

SoftReference 可以通过 SoftReference 类的构造函数来创建对象。例如:

```

List> softRefList = new ArrayList<>();

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> cache = new LinkedHashMap>(10, 0.75f, true) {

private static final long serialVersionUID = 1L;

@Override

protected boolean removeEldestEntry(Map.Entry> eldest) {

if (size() >= 10) {

Log.i("SoftReferenceExample", "removeEldestEntry - " + eldest.getKey());

return true;

}

return false;

}

};

public static Bitmap getBitmap(String key) {

SoftReference softReference = cache.get(key);

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(bmp));

return bmp;

}

}

private static Bitmap loadBitmap(String key) {

// 从网络或本地读取图片

return null;

}

}

```

在上述代码中,我们使用 SoftReference 实现了一个简单的图片缓存操作。当调用方法 getBitmap 时,若缓存中存在对应图片则直接返回,否则从网络或本地读取图片,并将其加入缓存。在这个示例中,我们设置了缓存最大容量为 10,并在 removeEldestEntry 中实现了按 LRU(最近最少使用)策略进行回收。

总结来说,SoftReference 主要解决的是内存占用的问题,通过将未被强指向的对象标记为“软可回收”的状态,让 JVM 在内存不足时可以自动回收这些对象。使用 SoftReference 的场景通常是需要频繁存取但不需要长期持有的对象,如缓存数据、图片等较大的资源。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(82) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部