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 多克-淘宝网  全品优惠

    目录
    相关文章
    |
    1天前
    |
    存储 缓存 Java
    【Java】Java中的引用类型(全面解读)
    【Java】Java中的引用类型(全面解读)
    6 0
    |
    1天前
    |
    缓存 监控 算法
    【Java】谈一谈虚引用
    【Java】谈一谈虚引用
    10 0
    |
    27天前
    |
    Java 数据库
    今天浅聊一下Java的四种引用类型
    【5月更文挑战第16天】今天浅聊一下Java的四种引用类型
    22 0
    |
    1月前
    |
    存储 安全 Java
    Java一分钟之Java数据类型概览:基本类型与引用类型
    【5月更文挑战第7天】本文概述了Java中的基本和引用数据类型,强调了理解它们对高效编程的重要性。基本类型包括数值、布尔和字符类型,而引用类型涉及类、接口、数组等。注意基本类型的精度损失和溢出问题,以及引用类型的空指针异常和内存泄漏。通过明确类型范围、使用包装类、空值检查和及时释放资源来避免这些问题。代码示例展示了基本类型和引用类型的使用。理解这些核心概念有助于编写更健壮的Java代码。
    22 1
    |
    1月前
    |
    存储 Java C语言
    【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
    【Java探索之旅】基本类型与引用类型 数组的应用 二维数组
    18 0
    |
    1月前
    |
    Java 程序员
    【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
    【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
    |
    1月前
    |
    缓存 Java
    【JAVA】强引用、软引用、弱引用、幻象引用有什么区别?
    幻象引用:幻象引用是最弱的引用类型,几乎不影响对象的生命周期。它们主要用于在对象被回收前进行某些预处理操作,例如在对象被销毁时执行特定的清理任务。
    31 0
    |
    1月前
    |
    Java 数据库
    详聊Java的四种引用类型
    最近,在回顾关于JVM的相关知识,其中有一个比较简单,同时又容易被大家忽视的知识点,就是关于4种引用的定义与使用场景,其实仔细刨析源码的时候会发现,在Java中很多地方都有涉及到关于不同引用的问题,并且有些面试官也会在面试的时候问及到这一块的内容
    21 1
    |
    18小时前
    |
    Java 程序员
    Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
    【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
    15 3
    |
    1天前
    |
    数据采集 安全 算法
    Java并发编程中的线程安全与性能优化
    在Java编程中,多线程并发是提升程序性能的关键之一。本文将深入探讨Java中的线程安全性问题及其解决方案,并介绍如何通过性能优化技术提升多线程程序的效率。
    9 3