Java当中强引用、软引用、弱引用及虚引用

java当中提供了四种类型的引用,分别是强引用、软引用、弱引用和虚引用,java当中提供这些类型的引用,主要是为了方便在垃圾回收时,将不需要的对象清理掉,从而不至于引发OOM异常错误。

强引用

    在我们前面介绍java当中对象的生命周期时,如果一个对象有强引用关系,那么将不会被垃圾回收收走,哪怕是抛出OOM异常,也不会回收。通常我们通过new 的方式创建的引用,都是强引用关系

Object obj = new Object();
String str = "abc";

    如果想要中断某个强引用和对象之间的关联,只需要把对象指向null, 这样在垃圾回收时,就会把之前的对象的内存空间清理掉

软引用(soft Reference)

    在java当中可以通过new SoftReference的方式来创建一个软引用,软引用主要是在内存空间不足的情况,垃圾回收会把软引用关联的引用回收掉,

软引用提供的两个方法

public SoftReference(T referent) {
    super(referent);
    this.timestamp = clock;
    }
 
public SoftReference(T referent, ReferenceQueue<? super T> q) {
    super(referent, q);
    this.timestamp = clock;
    }

软引用可以和一个ReferenceQueue关联,如果这个软引用所引用的对象被JVM回收走了,引用对象会被加入到与之关联的引用队列当中

适用场景:用来缓存一些数据,比如图片信息等

弱引用(weakReference)

    弱引用所包含的对象,在JVM进行垃圾回收时,不管内存是否充足都会被回收掉,弱引用的提供的两个构造方法

public class WeakReference<T> extends Reference<T> {
    public WeakReference(T referent) {
        super(referent);
    }

 
    public WeakReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }

}
    与弱引用相关联的引用如果被垃圾回收收走之后,弱引用的对象会放在对应的队列当中去
    java当中常见的就是ThreadLocal当中的使用ThreadLocalMap来保存threadLocal和对应的value值,其中threadLocalMap当中的key 就是threadLocal的弱引用。

    适用场景,比如需要将产品信息保存在Map当中,map的key我们一般使用product来表示,当product对象被销毁后,但是map当中却维护了强引用,一直都不能被回收,这个时候最好在map当中保存product的弱引用来作为key, 当然也可以使用java自带的WeakHashMap

虚引用(phantomReference)

    虚引用并不影响对象的生命周期,如果一个对象和虚引用关联,等于没有和任何对象关联一样,可以在任何时候都有可能被回收走。

    要注意的是,虚引用必须和引用队列关联,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列当中,程序可以通过判断引用队列是否加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象被回收之前采取必要的行动。

扫描二维码关注公众号,回复: 2346150 查看本文章
public class PhantomReference<T> extends Reference<T> {

    public T get() {
        return null;
    }


    public PhantomReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }

}


猜你喜欢

转载自blog.csdn.net/summerzbh123/article/details/80992255