![](https://img.haomeiwen.com/i2038754/acc858eb7ddc3fbb.jpg)
强引用StrongReference
最常见的引用类型,jvm即使是oom也不会回收拥有强引用的对象,
Object object = new Object();
上面的对象就是拥有强引用。
想要gc回收这个对象,就需要显式的将object = null ,那么对象就不存在引用关系
ArrayList<Object> arrayList = new ArrayList<>();
for (int i = 0; i < 9999999; i++) {
arrayList.add(new BufferedImage(999, 999, BufferedImage.TYPE_INT_RGB));
}
运行上面的代码,发现报错oom
软引用SoftReference
在jvm内存不够的时候就会回收拥有软引用的对象,在jvm内存充足的时候不会回收
ArrayList<SoftReference<Object>> arrayList = new ArrayList<>();
for (int i = 0; i < 9999999; i++) {
arrayList.add(new SoftReference<>(
new BufferedImage(999, 999, BufferedImage.TYPE_INT_RGB)));
}
跟强引用不同的是,每当jvm内存不够的时候,就会回收软引用对象new SoftReference<>(new BufferedImage(999, 999, BufferedImage.TYPE_INT_RGB)),所以并没有抛出oom
Android很多图片框架使用软引用来缓存bitmap,避免app的内存不足
弱引用WeakReference
跟软引用对象不一样的是,弱引用对象会在每一次的gc中被回收,不管jvm的内存怎么样,但是gc在jvm中的线程优先级是很低的,执行的次数比较少。
WeakReference<BufferedImage> reference = new WeakReference<BufferedImage>(
new BufferedImage(999, 999, BufferedImage.TYPE_INT_RGB));
System.gc();
if (reference.get() != null) {
BufferedImage bufferedImage = reference.get();
System.out.println("no null");
}
大多数都不会打印,因为虽然调用gc()函数,但是只是建议jvm进行gc操作,但是大多数情况jvm会接受这个建议,
在Android中重写Handler的时候经常使用弱引用
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
init();
}
private void init() {
mHandler = new MyHandler(this);
}
static class MyHandler extends Handler{
WeakReference<Activity> mActivityWeakReference;
public MyHandler(Activity activity) {
mActivityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
Main3Activity main3Activity = (Main3Activity) mActivityWeakReference.get();
if (main3Activity != null) {
//to do something
}
}
}
上面的handler为了预防持有activity的引用在activity销毁后gc时导致内存泄漏,
虚引用PhantomReference
不太常见的一种对象引用,貌似听闻由于测试??
网友评论