• 【教3妹学java】11.强引用,弱引用,软引用和虚引用的区别是什么?


    3妹
    3妹:“如果华陀再世,崇洋都被医治,外邦来学汉字,激发我民族意识”
    2哥:3妹不要只唱歌啊,跳起来啊, 刘畊宏女孩动起来!
    3妹:我是属于头脑简单,四肢不发达的, 动动嘴皮子还行, 要我运动还是算了吧。
    2哥:不运动不行啊,我们这行工作强度很大的, 身体是革命的本钱嘛。
    3妹:好吧,等我先把这一章节学完就来运动。
    2哥:在学什么呢,跟我说说
    3妹:java对象的4种引用的区别,你看:

    讲课

    #对象在内存中的3种状态
    1.可达状态
    有一个及以上的变量引用着对象。
    2.可恢复状态
    已经没有变量引用对象了,但是还没有被调用finalize()方法。系统在回收前会调用finalize()方法,如果在执行finalize()方法时,重新让一个变量引用了对象,那么对象会变成可达状态,否则会变成不可达状态。
    3.不可达状态
    执行finalize()方法后,对象还是没有被其他变量引用,那么对象就变成了不可达状态。

    对象的4种引用介绍

    Java执行GC判断对象是否存活有两种方式其中一种是引用计数。
    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。
    从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

    1.强引用

    就是普通的变量对对象的引用,强引用的对象不会被系统回收。

     Object strongReference = new Object();
    
    • 1

    如果强引用对象不使用时,显式地设置strongReference对象为null,从而使GC能够回收。

    2.软引用

    当内存空间足够时,软引用的对象不会被系统回收。当内存空间不足时,软引用的对象可能被系统回收。通常用于内存敏感的程序中。

        // 强引用
        String strongReference = new String("abc");
        // 软引用
        String str = new String("abc");
        SoftReference<String> softReference = new SoftReference<String>(str);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    软引用可以和一个引用队列(ReferenceQueue)联合使用。如果软引用所引用对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。

        ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
        String str = new String("abc");
        SoftReference<String> softReference = new SoftReference<>(str, referenceQueue);
     
        str = null;
        // Notify GC
        System.gc();
     
        System.out.println(softReference.get()); // abc
     
        Reference<? extends String> reference = referenceQueue.poll();
        System.out.println(reference); //null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当内存不足时,垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象,而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象。对那些刚构建的或刚使用过的“较新的”软对象会被虚拟机尽可能保留,这就是引入引用队列ReferenceQueue的原因。

    3.弱引用

    引用级别比软引用低,对于只有软引用的对象,不管内存是否足够,在垃圾回收时, 都可能会被系统回收。

        String str = new String("abc");
        WeakReference<String> weakReference = new WeakReference<>(str);
        str = null;
    
    • 1
    • 2
    • 3

    同样,弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

    4.虚引用

    虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
    虚引用主要用于跟踪对象被垃圾回收的状态,在垃圾回收时可以收到一个通知。
    虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

        String str = new String("abc");
        ReferenceQueue queue = new ReferenceQueue();
        // 创建虚引用,要求必须与一个引用队列关联
        PhantomReference pr = new PhantomReference(str, queue);
    
    • 1
    • 2
    • 3
    • 4

    总结

    Java中4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用

    当垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收。

    通过表格来说明一下,如下:

    引用类型被垃圾回收时间用途生存时间
    强引用从来不会对象的一般状态JVM停止运行时终止
    软引用当内存不足时对象缓存内存不足时终止
    弱引用正常垃圾回收时对象缓存垃圾回收后终止
    虚引用正常垃圾回收时跟踪对象的垃圾回收垃圾回收后终止
  • 相关阅读:
    【Leetcode】岛屿问题——dfs算法
    laravel-admin 头部添加操作
    Maven的详解
    Hudi第三章:集成Flink
    简述unity的模型动画功能
    打印机出现黄色感叹号!无法查看属性和设置,开机查看打印机,打印自动变灰色问题无法使用!
    3.深入理解Java并发编程
    力扣刷题日记/day7/6.30
    通信原理板块——利用香农公式对连续信道的信道容量计算
    【GIT问题解决】---- 在【.gitignore】中添加了忽略文件或文件夹后不生效
  • 原文地址:https://blog.csdn.net/kangbin825/article/details/125448127