Java强引用、软引用、弱引用、虚引用的区别是什么

我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用;软引用通过SoftReference类实现。 软引用的生命周期比强引用短一些;弱引用通过WeakReference类实现。 弱引用的生命周期比软引用短。

一、强引用

特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,具体回收时机还是要看垃圾收集策略。

应用场景:项目中到处都是。

二、软引用

特点:软引用通过SoftReference类实现。 软引用的生命周期比强引用短一些。只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。

应用场景:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。

具体实例:图片缓存框架中,“内存缓存”中的图片是以这种引用来保存,使得JVM在发生OOM之前,可以回收这部分缓存。

三、弱引用

特点:弱引用通过WeakReference类实现。 弱引用的生命周期比软引用短。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

应用场景:弱应用同样可用于内存敏感的缓存。

具体实例:在静态内部类中,经常会使用虚引用。例如,一个类发送网络请求,承担callback的静态内部类,则常以虚引用的方式来保存外部类(宿主类)的引用,当外部类需要被JVM回收时,不会因为网络请求没有及时回来,导致外部类不能被回收,引起内存泄漏。

四、虚引用

特点:虚引用也叫幻象引用,通过PhantomReference类来实现。无法通过虚引用访问对象的任何属性或函数。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

应用场景:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。

具体实例:一种引用的get()方法返回总是null,所以,可以想象,在平常的项目开发肯定用的少。

来源:https://blog.csdn.net/weixin_44052055/article/details/120856602

延伸阅读

芯片的用途

芯片(Chip)是一个集成电路的简称,它是电子设备中最基础的组件。电子设备,如电脑、手机、电视等几乎所有的电子设备都会使用到芯片。以下是芯片的一些主要用途:

  1. 数据处理:许多芯片被设计成微处理器,用于执行各种计算和数据处理任务。例如,你的电脑或手机中的中央处理器(CPU)就是一种芯片,它负责处理所有的计算任务。
  2. 存储数据:有些芯片,如闪存芯片,被用于存储数据。这些芯片可以在你的电脑、手机、USB驱动器或其他设备中找到。
  3. 网络通信:一些芯片被设计用于处理网络通信,包括无线和有线通信。例如,手机和电脑中的Wi-Fi芯片就是这样的一种。
  4. 图像处理:图形处理器(GPU)是一种特殊类型的芯片,它专门设计用于处理图像和视频相关的计算任务。GPU在视频游戏、图形设计和近年来的机器学习等领域都有广泛的应用。
  5. 声音处理:声卡中的音频处理器是用于处理音频信号的芯片,负责生成和播放声音。
  6. 控制硬件:许多芯片被用于控制电子设备中的其他硬件。例如,电脑主板上有很多芯片,用于控制内存、硬盘、USB设备等。

这些只是芯片的一些主要用途,事实上,芯片的应用领域非常广泛,几乎所有的电子设备和系统都需要使用到芯片。

文章标题:Java强引用、软引用、弱引用、虚引用的区别是什么,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/53567

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
E.ZE.Z认证作者
上一篇 2023年5月31日
下一篇 2023年5月31日

相关推荐

  • smt编程工作属于什么类

    SMT编程工作属于制造和生产行业中的技术类工作,此类工作涉及使用专业软件对表面贴装技术(Surface Mount Technology,简称SMT)生产线的设备进行编程。SMT编程师们负责创建和优化SMT设备的程序,以确保组件能够正确、高效地被放置在印刷电路板(PCB)上。工作的一个重点包括转换电…

    2024年4月27日
    900
  • 上位机编程软件有哪些

    上位机编程软件有:1、InTouch;2、iFix;3、Citech;4、WinCC;5、组态王;6、Controx(开物);7、ForceControl(力控)。InTouch软件是较早进入我国的组态软件,基于Windows3.1的InTouch软件曾让我们耳目一新,并且InTouch提供了丰富的…

    2023年1月10日
    6.9K00
  • 编程语言用什么代码

    编程语言的选择:如何选用合适的代码 当选择编程语言时,最关键的因素通常包括开发效率、性能、可维护性和社区支持。每种语言都有其独特的优势和应用场景。例如,Python因其易读性和广泛的库支持而常用于数据科学和快速原型开发;C++在游戏开发和高性能计算中占主导地位,因为它提供了接近硬件的控制和高效率的执…

    2024年4月26日
    2200
  • 澳洲devops什么意思

    澳洲DevOps代表一种目前在澳大利亚技术领域中普及的开发(Development)与运维(Operations)的结合。1、提高软件交付效率、2、增强团队跨功能协作、3、促进开发与运维的无缝集成为其主旨。在1中,提高软件交付效率通过自动化构建、测试与部署流程,减少人为干预,有效提升部署速度与质量。…

    2024年3月26日
    9300
  • 为什么Python要学习数据分析

    数据分析是当今世界的核心竞争力之一,Python是执行数据分析的首选语言。其原因在于Python提供的丰富数据分析工具、库、框架以及易用性。核心观点包括:1、易学性和强大的生态系统、2、数据处理能力、3、面向数据分析的库和框架、4、可视化工具、5、广泛的社区支持和资源、6、跨领域应用。采用Pytho…

    2023年11月16日
    35600
  • 儿童学编程用什么设备好

    儿童学编程最适合的设备包括1、教育机器人 2、平板电脑 3、专用编程学习设备。这些设备能够引起孩子们的兴趣,并提供一个互动性和趣味性兼具的学习环境。以教育机器人为例,它不仅可以激发孩子们对技术的兴趣,还可以在编程的过程中教授逻辑思维、问题解决以及创造性思维等技能。基于图形化编程语言的机器人平台,如L…

    2024年4月27日
    1200
  • JNI、类加载器的原理是什么

    JNI的工作原理是:Java应用程序调用JNI的本地方法;JNI将本地方法名称和参数转换成C/C++函数的调用;C/C++代码执行本地方法并返回结果;JNI将结果转换为Java对象或基本类型,返回给Java应用程序。 JNI JNI是Java平台上的一种编程框架,用于在Java虚拟机(JVM)中调用…

    2023年5月28日
    32900
  • 初中生学什么编程合适女生

    Python和Scratch 是合适初中生女生学习的编程语言。Python由于它的简单性和易读性,被广泛应用于数据科学、网络开发和自动化等多个领域,同时Python也是学习更高级编程概念的良好起点。Scratch是一种直观的块状编程语言,它允许孩子们通过拖放代码块来创建故事、游戏和动画,非常适合编程…

    2024年4月28日
    600
  • vscode为什么扩展失败

    VSCode扩展失败的原因可能包括网络问题、软件兼容性、权限设置不当、扩展冲突,以及扩展本身的缺陷。具体而言,最常见的扩展失败原因是因为网络连接问题。VSCode扩展通常需要从Microsoft的官方市场下载,如果你的网络连接不稳定或者无法访问这些服务器,就会导致扩展安装失败。同时,一些国家和地区可…

    2024年4月3日
    19800
  • 都有什么编程语言

    概述 当我们探讨编程语言时,1、多样性的蓬勃发展、2、持续的进化与创新、3、企业和开发者的实际需求导向构成了编程语言发展的核心动力。其中,多样性的蓬勃发展意味着市场上存在着针对不同应用场景的语言,从底层系统编程到高级应用开发,从数据分析到人工智能,各种语言为解决特定问题而设计。 一、编程语言的分类 …

    2024年4月26日
    1100

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部