Java的四种引用方式

强引用是四种引用方式生命周期最长的一个,任何情况下不会被JVM回收,如果JVM内存不足,则会报出OutOfMemory异常,如果想要终止强引用和某个对象的关联,可以显式地将引用赋值为null,这样垃圾回收器就会在合适的时间回收该对象
软引用使用软引用时,只有当内存空间不足的情况下,才会被垃圾回收器回收
弱引用弱引用和强引用,软引用相比生命周期更短,垃圾回收器一旦发现,就会马上被回收,但是由于垃圾回收器优先级较低,并不会马上迅速发现弱引用对象
虚引用虚引用,顾名思义,形同虚设,对于虚引用的对象,相当于没有引用,任何情况下都会被垃圾回收器回收

也可以看下这篇文章强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
强引用的应用:
Java当中的各个数据结构的clear算法几乎都使用了强引用,在clear时候直接将对象引用赋值为null

HashMap的clear方法

public void clear() {
    Node<K,V>[] tab;
    modCount++;
    if ((tab = table) != null && size > 0) {
        size = 0;
        for (int i = 0; i < tab.length; ++i)
            tab[i] = null;
    }
}

Arraylist的clear方法

public void clear() {
    modCount++;

    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

软引用的应用主要是缓存等方面
弱引用的应用:
ThreadLocal中的ThreadMap的key就是弱引用类型的,正因如此,每次使用完成后必须remove,否则value不会被回收,造成内存泄漏

/**
 * The entries in this hash map extend WeakReference, using
 * its main ref field as the key (which is always a
 * ThreadLocal object).  Note that null keys (i.e. entry.get()
 * == null) mean that the key is no longer referenced, so the
 * entry can be expunged from table.  Such entries are referred to
 * as "stale entries" in the code that follows.
 */
static class Entry extends WeakReference<ThreadLocal<?>> {
    /** The value associated with this ThreadLocal. */
    Object value;

    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

虚引用一般情况下会和队列组合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值