强引用,软引用,弱引用,虚引用 浅析

强引用,软引用,弱引用,虚引用 浅析_第1张图片

强引用StrongReference

最常见的引用类型,jvm即使是oom也不会回收拥有强引用的对象,

Object object = new Object();

上面的对象就是拥有强引用。
想要gc回收这个对象,就需要显式的将object = null ,那么对象就不存在引用关系

 ArrayList 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> 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 reference = new WeakReference(
            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 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

不太常见的一种对象引用,貌似听闻由于测试??

你可能感兴趣的:(强引用,软引用,弱引用,虚引用 浅析)