Java的引用类型有几种?区别是什么?
Java中的引用类型主要分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型在Java中主要用于垃圾回收(Garbage Collection)和内存管理,以便更有效地利用内存资源。
1. 强引用(Strong Reference):
强引用是最常见的引用类型,它是默认的引用类型。当一个对象被强引用关联时,即使系统面临内存不足的情况,垃圾收集器也不会回收该对象。这就意味着,只要强引用存在,对象就不会被回收,直到引用被解除。通常通过关键字new来创建对象,就会得到一个强引用。
Object obj = new Object(); // 强引用
强引用的优点是程序可以更容易地进行内存管理,但缺点是可能导致内存泄漏,因为对象不会被垃圾收集器回收。
2. 软引用(Soft Reference):
软引用用于描述一些还有用但非必须保留的对象。在系统面临内存不足的情况下,垃圾收集器会回收这些对象,但只有当系统内存真的不足时才会回收。通过软引用,可以在内存不足时释放一些资源,防止OutOfMemoryError的发生。
SoftReference<Object> softRef = new SoftReference<>(new Object());
软引用适用于需要缓存的场景,比如缓存图片。当内存充足时,软引用可以保留对象,但在内存不足时,垃圾收集器会自动回收这些软引用指向的对象。
3. 弱引用(Weak Reference):
弱引用用于描述非必须保留的对象,与软引用不同的是,只要对象只被弱引用引用,垃圾收集器就有权回收该对象。弱引用通常用于实现缓存,当对象没有强引用时,垃圾收集器可以自动回收。
WeakReference<Object> weakRef = new WeakReference<>(new Object());
弱引用适用于临时性的对象引用,当该对象没有强引用时,就会被回收。这在实现某些缓存策略时非常有用。
4. 虚引用(Phantom Reference):
虚引用是最弱的一种引用,它几乎没有实际意义的引用。虚引用的存在主要是为了追踪对象被垃圾收集器回收的活动。当一个对象只有虚引用时,垃圾收集器会在对象被回收时,将虚引用放入一个ReferenceQueue中,通过监控ReferenceQueue,可以了解对象何时被回收。
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
虚引用通常用于管理直接内存,比如NIO中的ByteBuffer。通过虚引用,可以在对象被回收时做一些额外的清理工作。
引用类型的比较:
-
生命周期:
- 强引用:对象只有在没有任何强引用时才会被回收。
- 软引用:在内存不足时会被回收,有助于避免OutOfMemoryError。
- 弱引用:只要对象只被弱引用引用,就可以被回收。
- 虚引用:主要用于跟踪对象被回收的活动,不能单独使用。
-
回收时机:
- 强引用:不会被垃圾收集器主动回收。
- 软引用:在内存不足时可能被回收。
- 弱引用:只要没有强引用引用,就可能被回收。
- 虚引用:当对象被回收时,会被放入ReferenceQueue中。
-
适用场景:
- 强引用:适用于需要确保对象不会被垃圾收集器回收的场景。
- 软引用:适用于缓存等需要在内存不足时释放资源的场景。
- 弱引用:适用于临时性对象引用,可被垃圾收集器回收的场景。
- 虚引用:适用于需要在对象被回收时执行一些额外操作的场景。
Java的引用类型提供了灵活的内存管理机制,可以根据不同的场景选择合适的引用类型。强引用适用于确保对象不会被回收的场景,软引用和弱引用适用于需要释放资源的场景,虚引用则用于执行一些额外的清理操作。合理使用引用类型可以有效地提高内存利用率,防止内存泄漏,并优化程序性能。
黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)
黑马程序员Java零基础视频教程_下部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)
相关文章:
Java的引用类型有几种?区别是什么?
Java中的引用类型主要分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些引用类型在Java中主要用于…...
掌握iText:轻松处理PDF文档-基础篇
关于iText iText是一个强大的PDF处理库,可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作,同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X,且iText5不是完全免费的,但是基础能力是免费使用的&…...
小红书民宿文案怎么写?建议收藏
随着民宿市场的日益火爆,如何在众多民宿中脱颖而出,吸引更多租客入住,成为摆在每一位民宿业主面前的难题。一篇优质的小红书民宿文案,不仅能吸引潜在租客的关注,还能提高民宿的知名度。本文伯乐网络传媒将从八个方面教…...
C#教程(一):面向对象
1、介绍 C#是一种多范式编程语言,但其中一个主要的编程范式是面向对象编程(OOP)。面向对象编程有一些特点,而C#提供了丰富的功能来支持这些特点。 2、面向对象特点 封装(Encapsulation): 封装…...
Linux系统中部署minio服务、开启反向代理、二级域名SSL加固
链接: B站1小时-配置指导视频: 一、创建minio 文件目录(/project/minio) 二、下载Minio wget https://dl.min.io/server/minio/release/linux-amd64/minio 三、在minio目录中-创建日志文件 四、对minio(可以理解为windows系统中的.exe可执行文件) 进行授权 chmod 777 min…...
PMP备考总结:项目管理PMP考试提高通过率,轻松上岸~
分享一篇左羊学霸的备考总结,希望能帮到正在备考的友友们~ 前言 作为⼀名通过PMP项⽬管理认证并且拿到3A成绩 ( PMP认证最好成绩) 的 学习者, 来跟⼤家分享下我考取PMP证书的动机与过程 。考证不是主要⽬ 的, 在考证的过程深化⾃⼰的项⽬管理…...
shell脚本中获取当前脚本的绝对路径
说明: PWD 是获取当前脚本的执行路径的,下面的方式是获取文件绝对路径的。 话不多说,直接上硬货!!! #!/bin/bashecho "执行路径 $PWD"absolute_path$(readlink -f "$0") # 获取目录路径 directory$(dirname "$absolute_path&q…...
SSD基础架构与NAND IO并发问题探讨
在我们的日常生活中,我们经常会遇到一些“快如闪电”的事物:比如那场突如其来的雨、那个突然出现在你眼前的前任、还有就是今天我们要聊的——固态硬盘(SSD)。 如果你是一个技术宅,或者对速度有着近乎偏执的追求&…...
激光雷达反射率定标板如何提取障碍信息
随着信息科技技术的发展,自动驾驶技术在移动机器人等智能移动设备领域得到广泛应用。智能移动设备不仅减少了人力劳动,方便生活,而且提高了工作效率。激光雷达作为自动驾驶技术的核心避障传感器,得到迅速发展。 激光雷达通过对发射…...
【开源】基于JAVA的桃花峪滑雪场租赁系统
项目编号: S 036 ,文末获取源码。 \color{red}{项目编号:S036,文末获取源码。} 项目编号:S036,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设…...
将VOC2012格式的数据集转为YOLOV8格式
文章目录 简介1.数据集格式1.1数据集目录格式对比1.2标签格式对比 2.格式转换脚本3.文件处理脚本 简介 将voc2012中xml格式的标签转为yolov8中txt格式将转换后的图像和标签按照yolov8训练的要求整理为对应的目录结构 1.数据集格式 1.1数据集目录格式对比 (1&…...
DevExpress WinForms Pivot Grid组件,一个类似Excel的数据透视表控件(二)
界面控件DevExpress WinForms的Pivot Grid组件是一个类似Excel的数据透视表控件,用于多维(OLAP)数据分析和跨选项卡报表。在上文中(点击这里回顾>>)我们介绍了DevExpress WinForms Pivot Grid组件的性能、分析服务、数据塑造能力等&…...
为什么越来越多的人从事软件测试行业?
1.市场需求增加:随着数字化转型和互联网的普及,各行各业都需要高质量、稳定可靠的软件来支持其业务运作。因此,对软件测试人员的需求也随之增加。同时,新兴技术的发展,如物联网、大数据、区块链、人工智能等࿰…...
ERP数据仓库模型
ERP数据仓库模型建设是一个复杂的过程,涉及到多个主题域。以下是一个详细的设计方案: 确定业务需求和目标 在开始设计数据仓库模型之前,需要了解企业的业务需求和目标。这包括了解企业的运营模式、业务流程、关键绩效指标等。通过与业务部门…...
基于单片机的智能小车 (论文+源码)
1. 系统设计 此次可编程智能小车系统的设计系统,结合STM32单片机,蓝牙模块,循迹模块,电机驱动模块来共同完成本次设计,实现小车的循迹避障功能和手机遥控功能,其整体框架如图2.1所示。其中,采用…...
Redis和MySQL双写一致性实用解析
1、背景 先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致(即缓存一致性问题…...
win10彻底永久关闭自动更新的方法
win10彻底永久关闭自动更新的方法 文章目录 win10彻底永久关闭自动更新的方法一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务 可以参考这个视频的做法: 教学视频搬用 一、禁用Windows Update服务 1、同时按下键盘 Win R,打开运行…...
【webpack】初始化
webpack 旧项目的问题下一代构建工具 Vite 主角 :webpack安装webpack1,mode的选项2,使用source map 精准定位错误行数3,使用watch mode(观察模式),自动运行4,使用webpack-dev-server工具,自动刷…...
服务器GPU占用,kill -9 PID 用不了,解决办法
PID(progress ID 进程ID) 上图为占用情况,使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法,一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…...
Vue学习笔记-Vue3中的toRaw和markRaw
toRaw 作用:将一个由reactive生成的响应式对象转为普通对象 导入: import {toRaw} from vue 使用方法: let data reactive({k1:v1,k2:v2 }) //将对象变为非响应式的普通对象 let raw_data toRaw(data)使用场景:用于读取响应式…...
运算放大器与比较器的本质区别及应用指南
1. 运算放大器与比较器的本质区别在电子电路设计中,运算放大器(Op-Amp)和电压比较器(Comparator)是两种极为常见却又经常被混淆的器件。它们在外观符号上几乎一模一样:都有五个引脚——正负电源端、同相与反…...
Nacos服务实例权重设置详解:如何根据服务器性能动态调整流量分配
Nacos服务实例权重设置详解:如何根据服务器性能动态调整流量分配 在分布式系统架构中,服务实例的性能差异是不可避免的现实问题。新采购的服务器与运行多年的老旧设备并存,不同配置的云主机混合部署,这些场景都要求我们能够智能地…...
【深度解析】用 Superpowers 改造 AI 编码代理:从“快手实习生”到“有流程的工程师”
摘要 本文从 Superpowers 开源项目出发,拆解它背后的「AI 软件开发方法论」:如何通过技能(Skills)、子代理(Sub-agents)、规则(Rules)和 Git 工作流,让 AI 编码代理不再只…...
Python内存监控体系搭建:Prometheus+Custom Metrics+内存火焰图,实现OOM前15分钟精准预警
第一章:Python智能体内存管理策略 Python智能体(如基于LLM的Agent、ReAct架构或Tool-Calling Agent)在运行过程中频繁创建临时对象、缓存推理上下文、序列化工具调用结果,导致内存压力显著高于常规脚本。其内存管理需兼顾GC效率、…...
PX4无人机Offboard模式实战:从Gazebo仿真到真机避坑指南(附Python/C++代码对比)
PX4无人机Offboard模式全流程实战:从仿真到真机的Python/C双语言开发指南 1. Offboard模式核心原理与开发环境搭建 Offboard模式是PX4飞控系统中最为强大的控制模式之一,它允许开发者通过外部计算机(如运行ROS的机载电脑)发送精确…...
保姆级教程:用STM32F103C8T6(CUBEMX HAL库)读取航模遥控器PPM信号,附完整代码
低成本STM32F103C8T6读取航模PPM信号实战指南 航模遥控器的PPM信号解析一直是DIY爱好者的热门话题。相比昂贵的专用解码器,一块十几元的STM32F103C8T6开发板就能实现相同功能。本文将手把手教你用最常见的"蓝板"完成从硬件连接到代码调试的全过程。 1. 硬…...
React项目实战:用XGPlayer打造带封面预览的沉浸式视频播放组件(附完整代码)
React项目实战:用XGPlayer打造带封面预览的沉浸式视频播放组件(附完整代码) 在当今内容为王的时代,视频已成为Web应用中不可或缺的元素。但如何让视频组件既美观又高效,同时提供流畅的用户体验?本文将带你深…...
新手福音:基于快马平台零基础入门Ubuntu与OpenClaw机器人开发
作为一个刚接触机器人开发的新手,最近在Ubuntu上折腾OpenClaw机器人开发时踩了不少坑。从环境配置到代码调试,每一步都让人头大。不过后来发现了InsCode(快马)平台,简直像找到了救星。今天就把我的学习过程整理成笔记,分享给同样想…...
CVPR 2025新作SAGE实战:用SAM语义先验+知识蒸馏,搞定红外与可见光图像融合
SAGE实战指南:如何将CVPR 2025前沿成果落地红外与可见光图像融合项目 在计算机视觉领域,多模态图像融合技术正经历着从传统方法到深度学习驱动的范式转变。2025年CVPR会议提出的SAGE(Semantic-Aware Guided Enhancement)方法&…...
PX4仿真环境下的XTDrone实战:解决roslaunch常见错误的5个技巧
PX4仿真环境下的XTDrone实战:解决roslaunch常见错误的5个技巧 在无人机开发领域,PX4与ROS的结合为开发者提供了强大的仿真和测试平台。XTDrone作为基于PX4和ROS的开源无人机仿真框架,已经成为许多开发者和研究团队的首选工具。然而࿰…...
