SoftReference 为什么被 Android “放弃”

JDK 中除了默认的 Strong Reference 之外,还有三个其他的 Reference:

WeakReference

SoftReference

PhantomReference

他们都是为了更高效地利用 Heap。

WeakReference

如果一个变量的 Reference 只剩下 WeakReference,那么 GC 会毫不留情地把这个变量回收掉。

也就是说,WeakReference没有能力能够让这个变量可以在内存中再飞一会。

Android 开发者应该都了解 WeakReference 的用法,一个比较典型的应用场景是 Handler,为了避免 Memory Leak,我们会定义一个内部静态类,然后以 WeakReference 的形式引用 Activity,这样一来,队列中的 Message(可能会排队很长时间)就不会干扰到 GC 回收 Activity。

用法示例:

SoftReference

从SoftReference的官方定义 来看,只有当内存告急(即将 OOM)时,才会对只剩下 Soft Reference 的变量进行回收,因此 SoftReference 比较适合用来做 Cache: Soft refeence are most often used to implement memory-sensitive caches.

但是 SoftReference的Android 版本对此持不同意见: In practice,soft references are inefficient for caching.

因为SoftReference 无法提供足够的信息可以让 runtime 很轻松地决定 clear 它还是 keep 它。举个例子,如果有 10 个 SoftReference 变量,并且他们所引用的变量都没有了 Strong Reference,那么 runtime 就懵逼了,因为它不知道该 clear 哪几个或者 keep 哪几个。更要命的是,runtime 不知道应该是 clear 掉 SoftReference 还是增大 Heap。

所以 Android 放弃了 SoftReference ,推荐使用android.util.LruCache 做 Cache 管理,至少 LrcCache可以根据变量的使用频次来决定是否应该 clear 掉它,这样就比单纯使用 SoftReference多了一个决策条件。

转载自:简书
作者:双鱼大猫
链接:https://www.jianshu.com/p/2171a55714db
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值