强引用、软引用、弱引用、虚引用

2022-02-02  本文已影响0人  喏喏2021

1. 强引用 StrongReference

就是我们最普遍使用的方式,如

Object obj = new Object();

这样对于我们,就是创建一个强引用,只要引用存在,jvm就不会回收引用对应的空间,哪怕是报出内存空间不足的异常
当我们确定不需要使用obj对象时,可以
将obj置为null,这样jvm就认为它将不再使用,可以回收,但具体回收的时机还要看gc策略

2. 软引用 SoftReference

内存空间不足时,进行垃圾回收,如果内存空间足时,不会发生回收。
软引用一般和引用队列结合使用,当对象回收时,会加入到关联的引用队列中

public class SoftReferenceTest {
    public static void main(String[] args) {
        //原始强引用
        String welcome = "hello world";
        ReferenceQueue<String> refQueue = new ReferenceQueue<String>();
        SoftReference<String> welcomeRef = new SoftReference<>(welcome,refQueue);
        
        //置为空,这时可以垃圾回收
        welcome = null;
        //这时不一定回收,只有空间不足时,才会回收
        System.gc();
        //这时可能会引用到,也可能引用不到,就看是否空间不足,是否发生了回收
        String welcomeValue = welcomeRef.get();
        //如果垃圾回收了,则值不为空,如果还没有回收,则为空
        Reference<? extends String> valueRef = refQueue.poll();
    }
}

3. 弱引用 WeakReference

与软引用相似,区别就是发生垃圾回收时,就会将弱引用对象进行回收,而不用考虑空间是否够用。

4. 虚引用 PhantomReference

与前面引用不同, 虚引用的对象,在任何时间都可能被垃圾回收,它必须和引用队列联合使用,
当我们回收对象时,发现它还有虚引用,就会在内存回收前,将虛引用增加到引用队列中,
这时我们可以通过判断引用队列中,是否有相应的虚引用,然后在对象回收之前采取必须的措施。

上一篇下一篇

猜你喜欢

热点阅读