Java引用类型:强引用,软引用,弱引用,虚引用

简介: Java引用类型:强引用,软引用,弱引用,虚引用

    在Java中提供了4个级别的引用:强引用,软引用,弱引用,虚引用,使程序能更加灵活地控制对象的生命周期。在这4个引用级别中,只有强引用FinalReference类是包内可见,其他3中引用类型均为public,可以在应用程序中直接使用。

强引用

Java中的引用,有点像C++的指针,通过引用,可以对堆中的对象进行操作。 在我们的代码生涯中,大部分使用的都是强引用,所谓强引入,都是形如Object o = new Object()的操作。 强引用具备一下特点:

    • 强引用可以直接访问目标对象
    • 强引用所指向的对象在任何时候不会被系统回收,JVM宁愿抛出OOM异常,也不回收强引用所指向的对象
    • 强引用可能导致内存泄漏

     通常来说,应用程序内部的内存泄露两种情况。一种是虚拟机中存在程序无法使用的内存区域,另一种情况是程序中存在大量存活时间过长的对象。

    软引用

    软引用是除强引用外,最强的引用类型。可以通过java.lang.ref.SoftReference使用软引用,一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收,当堆使用率临近阈值时,才会去回收软引用对象。只要有足够的内存,软引用便可能在内存中存活相当长一段时间。因此,软引用可以用于实现对内存敏感的Cache。 在java doc中,软引用是这样描述的

    虚拟机在抛出 OutOfMemoryError 之前会保证所有的软引用对象已被清除。此外,没有任何约束保证软引用将在某个特定的时间点被清除,或者确定一组不同的软引用对象被清除的顺序。不过,虚拟机的具体实现会倾向于不清除最近创建或最近使用过的软引用。

    弱引用

    弱引用时一种比软引用较弱的引用类型。在系统GC时,只要发现弱引用,不管系统对空间是否足够,都会对对象进行回收。但是,由于垃圾回收器的线程通常优先级很低,因此,并不一定能很快地发现持有弱引用的对象。在这种情况下,弱引用对象可以存在较长时间。一旦一个弱引用对象被垃圾收集器回收,便会加入导一个注册引用队列中

    虚引用

    虚引用时所有引用类型中最弱的一个,一个持有弱引用的对象,和没有引用几乎是一样的,随时都可能被垃圾回收器回收。当试图通过虚引用的get()方法取得强引用时,总会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。当垃圾回收器准备回收一个对象时,如果发现他还有虚引用,就会在垃圾回收后销毁这个对象,将这个对象加入引用队列。虚引用主要用于检测对象是否已经从内存中删除。

    SoftReference<String> stringSoftReference = new SoftReference<>(new String("软 引用 仔"));
            System.out.println(stringSoftReference.get());
            System.gc();
            System.out.println(stringSoftReference.get());
            //弱引用
            WeakReference<String> str = new WeakReference<>("弱reference 森");
            System.out.println(str.get());
            System.gc();  //通知JVM进行内存回收
            System.out.println(str.get());
            //虚引用
            ReferenceQueue<Object> queue = new ReferenceQueue<>();
            PhantomReference<String> strs = new PhantomReference<>("虚引用 ", queue);
            System.out.println(strs.get());
            System.out.println(S);

    image.gif

    四种引用的区别:

    image.gif




    文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群

    创作不易,如果觉得文章不错,可以点赞收藏评论

    你的支持和鼓励是我创作的动力❗❗❗

    官网Doker 多克;官方旗舰店首页-Doker 多克-淘宝网  全品优惠

    目录
    相关文章
    |
    5月前
    |
    缓存 Java 程序员
    Java面试题:解释强引用、软引用、弱引用和虚引用在Java中是如何工作的?
    Java面试题:解释强引用、软引用、弱引用和虚引用在Java中是如何工作的?
    40 1
    |
    5月前
    |
    缓存 算法 Java
    Java面试题:深入探究Java内存模型与垃圾回收机制,Java中的引用类型在内存管理和垃圾回收中的作用,Java中的finalize方法及其在垃圾回收中的作用,哪种策略能够提高垃圾回收的效率
    Java面试题:深入探究Java内存模型与垃圾回收机制,Java中的引用类型在内存管理和垃圾回收中的作用,Java中的finalize方法及其在垃圾回收中的作用,哪种策略能够提高垃圾回收的效率
    44 1
    |
    2月前
    |
    存储 Java 程序员
    【一步一步了解Java系列】:何为数组,何为引用类型
    【一步一步了解Java系列】:何为数组,何为引用类型
    34 1
    |
    2月前
    |
    存储 Java 编译器
    [Java]基本数据类型与引用类型赋值的底层分析
    本文详细分析了Java中不同类型引用的存储方式,包括int、Integer、int[]、Integer[]等,并探讨了byte与其他类型间的转换及String的相关特性。文章通过多个示例解释了引用和对象的存储位置,以及字符串常量池的使用。此外,还对比了String和StringBuilder的性能差异,帮助读者深入理解Java内存管理机制。
    28 0
    |
    6月前
    |
    缓存 Java 数据库连接
    java面试题目 强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
    【6月更文挑战第28天】在 Java 中,理解和正确使用各种引用类型(强引用、软引用、弱引用、幻象引用)对有效的内存管理和垃圾回收至关重要。下面我们详细解读这些引用类型的区别及其具体使用场景。
    95 3
    |
    6月前
    |
    缓存 Java 开发者
    深入理解Java的五种引用类型
    深入理解Java的五种引用类型
    |
    5月前
    |
    Java 运维
    开发与运维引用问题之软引用又在Java特点如何解决
    开发与运维引用问题之软引用又在Java特点如何解决
    49 0
    |
    7月前
    |
    Java
    【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
    【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用
    523 0
    |
    7月前
    |
    缓存 Java 程序员
    Java垃圾回收: 什么是强引用、软引用、弱引用和虚引用?
    Java垃圾回收: 什么是强引用、软引用、弱引用和虚引用?
    79 2
    |
    算法 Java C++
    14-理解Java中的不同引用类型:强引用、软引用、弱引用和虚引用
    这篇文章将深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用。我们将逐一解释每种引用类型的特性和用途。
    121 0
    14-理解Java中的不同引用类型:强引用、软引用、弱引用和虚引用