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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容