热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析:强引用、软引用、弱引用与幻象引用的区别与应用场景

本文由编程笔记#小编为大家整理,主要介绍了谈谈强引用,软引用,弱引用,幻象引用有什么区别相关的知识,希望对你有一定的参考价值。在java语言中,除了基本数据类型以外,其他的引用都是各类对象的引用,根据
本文由编程笔记#小编为大家整理,主要介绍了谈谈强引用,软引用,弱引用,幻象引用有什么区别相关的知识,希望对你有一定的参考价值。

在java语言中,除了基本数据类型以外,其他的引用都是各类对象的引用,根据生命周期的长短,分为以下四类:

强引用:我们new的对象所关联的引用就是强引用,当jvm内存空间不足时,宁肯抛出oom运行时错误,也不会将该引用回收来解决内存不足的问题。除非将其赋值为null或者超过引用的作用范围,该引用指向的对象才会被回收。

软引用:通过SoftReference类来实现,软引用的生命周期比强引用短,只有在jvm抛出OOM之前,才会将该引用指向的对象回收。软引用可以和一个引用队列配合使用,如果软引用指向的对象被垃圾回收器回收,jvm就会把这个软引用加入到引用队列中,后面我们可以调用ReferenceQueue的poll方法来检查是否有我们关心的对象被回收,如果队列为空,则返回一个null,否则返回reference对象。

弱引用:通过WeakReference类来实现,弱引用的生命周期比软引用短,在垃圾回收器扫描它所负责的内存区域的过程中,一旦发现有弱引用的对象,无论当前内存空间是否足够,都会将该引用所指向的对象回收。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快的将其回收,所以我们也可以将弱引用配合引用队列来使用,如果弱引用指向的对象被垃圾回收器回收,jvm就会把这个弱引用加入到引用队列中,后续我们好判断我们所关心的弱引用指向的对象是否被回收。

幻象引用:幻象引用也叫虚引用,通过PhantomReference类来实现。我们无法通过虚引用访问它所指向对象的任何属性和方法,如果一个对象仅仅持有虚引用,那么 它就和没有任何引用一样,随时可能被垃圾回收器回收,因此必须搭配引用队列来使用,当垃圾回收期准备回收一个对象时,如果发现它还有虚引用,那么就在回收之前将它放入引用队列并采取操作。


推荐阅读
  • Java中的引用类型详解
    本文详细介绍了Java中的引用类型,包括强引用、软引用、弱引用和虚引用的特点和应用场景。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • Jenkins API当前未直接提供获取任务构建队列长度的功能,因此需要通过解析HTML页面来间接实现这一需求。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文探讨了Java中线程的多种终止方式及其状态转换,提供了关于如何安全有效地终止线程的指导。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • RocketMQ 运维监控实践指南
    本文详细介绍了如何实现 RocketMQ 的运维监控,包括监控平台的搭建、常用运维命令及其具体用法。适合对 RocketMQ 监控感兴趣的读者参考。 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
author-avatar
sunsijia
业精于勤荒于嬉
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有