WeakReference 弱引用
SoftReference 软引用
这两个都是jvm优化运行内存所提供的包裹型 API
WeakReference 弱引用 触发条件,该两个条件必须同时符合时系统才会回收该包裹对象的运行内存
1、GC触发
2、被包裹对象没有被引用
作用: 常用于防止内存泄露,适用范围 及其消耗内存和容易被重新构建 的 对象
如常驻型的Handler,当一个Activity创建一个Handler时,有可能会在Activity销毁或者意外销毁的情况下Handler依然在执行任务,从而导致内存溢出,防范如下(伪代码)
class HomeActivity : Activity(){
lateinit var weakReference : WeakReference<HomeActivity>
overrider onCreate(){
weakReference = WeakReference<HomeActivity>(this)
}
val handler : Handler(){
overrider fun handlerMessage(msg:Message){
if (weakReference.get() != null){
// to do ...
}
}
}
}
SoftReference 软引用 触发条件与GC无关
1、当运行内存不足时就会回收SoftReference包裹的对象
以上两种防范只是能避免内存溢出,不是绝对能防止内存溢出的,因为当GC进行二次清理内存时内存不足还是会出现内存溢出