面试总结:强引用、软引用、弱引用、虚引用

原文链接: http://blog.csdn.net/mazhimazh/article/details/19752475

强引用(StrongReference)

强引用是最常用的一种引用方式,即

Object obj = new Object();

obj就是一个强引用,指向Object对象,属于引用变量,被存放在栈中;new Object()则创建了一个Object对象,Object对象存放在堆区。
众所周知,堆区是垃圾回收的主要场所,引用与垃圾回收息息相关。
GC在查找Object对象的引用链时,发现有强引用,就不会回收该对象。如果堆区空间不够了,这时又有新建对象要放入堆区,GC也不会去回收引用链中有强引用的对象,而是抛出OOM异常。

那么如何回收带强引用的对象呢?
引用不指向该对象就行了,指向null或任何其他对象就行,因为对象的引用链为空就会被回收。看下ArrayList的remove方法:

public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

clear to let GC do its work 这句话通俗易懂。

软引用(SoftReference)

SoftReference<Object> objectSoftReference = new SoftReference<>(new Object(), new ReferenceQueue<>());
//ReferenceQueue是可选参数
SoftReference<Object> objectSoftReference = new SoftReference<>(new Object());

软引用与强引用除了声明上的区别,还体现在,堆区空间不足时,GC会回收引用链中只有软引用的对象(并在回收前将该对象的引用添加到与之关联的ReferenceQueue中)。

弱引用(WeakReference)

WeakReference<Object> objectWeakReference = new WeakReference<>(new Object(), new ReferenceQueue<>());
//ReferenceQueue是可选参数
WeakReference<Object> objectWeakReference = new WeakReference<>(new Object());

弱引用与软引用的区别是GC只要发现了引用链中只有弱引用的对象,无论堆区空间是否足够都会回收该对象(并在回收前将该对象的引用添加到与之关联的ReferenceQueue中)。

虚引用(PhantomReference)

//ReferenceQueue是必需参数
PhantomReference<Object> objectPhantomReference = new PhantomReference<>(new Object(), new ReferenceQueue<>());

虚引用和弱引用的区别是虚引用在创建时必须有ReferenceQueue,即虚引用必须和ReferenceQueue联合使用。且根本就不能通过虚引用来获取对象或访问对象的方法,虚引用的用处就是在对象回收前,即判断ReferenceQueue中是否有该虚引用,有虚引用就表示对象即将被回收,这个时候可以做点事情。此处参考 https://blog.csdn.net/qq541005640/article/details/81532818

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值