当前位置: 首页 > news >正文

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中的引用类型主要分为四种&#xff1a;强引用&#xff08;Strong Reference&#xff09;、软引用&#xff08;Soft Reference&#xff09;、弱引用&#xff08;Weak Reference&#xff09;和虚引用&#xff08;Phantom Reference&#xff09;。这些引用类型在Java中主要用于…...

掌握iText:轻松处理PDF文档-基础篇

关于iText iText是一个强大的PDF处理库&#xff0c;可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作&#xff0c;同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X&#xff0c;且iText5不是完全免费的&#xff0c;但是基础能力是免费使用的&…...

小红书民宿文案怎么写?建议收藏

随着民宿市场的日益火爆&#xff0c;如何在众多民宿中脱颖而出&#xff0c;吸引更多租客入住&#xff0c;成为摆在每一位民宿业主面前的难题。一篇优质的小红书民宿文案&#xff0c;不仅能吸引潜在租客的关注&#xff0c;还能提高民宿的知名度。本文伯乐网络传媒将从八个方面教…...

C#教程(一):面向对象

1、介绍 C#是一种多范式编程语言&#xff0c;但其中一个主要的编程范式是面向对象编程&#xff08;OOP&#xff09;。面向对象编程有一些特点&#xff0c;而C#提供了丰富的功能来支持这些特点。 2、面向对象特点 封装&#xff08;Encapsulation&#xff09;&#xff1a; 封装…...

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考试提高通过率,轻松上岸~

分享一篇左羊学霸的备考总结&#xff0c;希望能帮到正在备考的友友们~ 前言 作为⼀名通过PMP项⽬管理认证并且拿到3A成绩 ( PMP认证最好成绩) 的 学习者&#xff0c; 来跟⼤家分享下我考取PMP证书的动机与过程 。考证不是主要⽬ 的&#xff0c; 在考证的过程深化⾃⼰的项⽬管理…...

shell脚本中获取当前脚本的绝对路径

说明: PWD 是获取当前脚本的执行路径的&#xff0c;下面的方式是获取文件绝对路径的。 话不多说&#xff0c;直接上硬货!!! #!/bin/bashecho "执行路径 $PWD"absolute_path$(readlink -f "$0") # 获取目录路径 directory$(dirname "$absolute_path&q…...

SSD基础架构与NAND IO并发问题探讨

在我们的日常生活中&#xff0c;我们经常会遇到一些“快如闪电”的事物&#xff1a;比如那场突如其来的雨、那个突然出现在你眼前的前任、还有就是今天我们要聊的——固态硬盘&#xff08;SSD&#xff09;。 如果你是一个技术宅&#xff0c;或者对速度有着近乎偏执的追求&…...

激光雷达反射率定标板如何提取障碍信息

随着信息科技技术的发展&#xff0c;自动驾驶技术在移动机器人等智能移动设备领域得到广泛应用。智能移动设备不仅减少了人力劳动&#xff0c;方便生活&#xff0c;而且提高了工作效率。激光雷达作为自动驾驶技术的核心避障传感器&#xff0c;得到迅速发展。 激光雷达通过对发射…...

【开源】基于JAVA的桃花峪滑雪场租赁系统

项目编号&#xff1a; S 036 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S036&#xff0c;文末获取源码。} 项目编号&#xff1a;S036&#xff0c;文末获取源码。 目录 一、摘要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数据集目录格式对比 &#xff08;1&…...

DevExpress WinForms Pivot Grid组件,一个类似Excel的数据透视表控件(二)

界面控件DevExpress WinForms的Pivot Grid组件是一个类似Excel的数据透视表控件&#xff0c;用于多维(OLAP)数据分析和跨选项卡报表。在上文中&#xff08;点击这里回顾>>&#xff09;我们介绍了DevExpress WinForms Pivot Grid组件的性能、分析服务、数据塑造能力等&…...

为什么越来越多的人从事软件测试行业?

1.市场需求增加&#xff1a;随着数字化转型和互联网的普及&#xff0c;各行各业都需要高质量、稳定可靠的软件来支持其业务运作。因此&#xff0c;对软件测试人员的需求也随之增加。同时&#xff0c;新兴技术的发展&#xff0c;如物联网、大数据、区块链、人工智能等&#xff0…...

ERP数据仓库模型

ERP数据仓库模型建设是一个复杂的过程&#xff0c;涉及到多个主题域。以下是一个详细的设计方案&#xff1a; 确定业务需求和目标 在开始设计数据仓库模型之前&#xff0c;需要了解企业的业务需求和目标。这包括了解企业的运营模式、业务流程、关键绩效指标等。通过与业务部门…...

基于单片机的智能小车 (论文+源码)

1. 系统设计 此次可编程智能小车系统的设计系统&#xff0c;结合STM32单片机&#xff0c;蓝牙模块&#xff0c;循迹模块&#xff0c;电机驱动模块来共同完成本次设计&#xff0c;实现小车的循迹避障功能和手机遥控功能&#xff0c;其整体框架如图2.1所示。其中&#xff0c;采用…...

Redis和MySQL双写一致性实用解析

1、背景 先阐明一下Mysql和Redis的关系&#xff1a;Mysql是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致&#xff08;即缓存一致性问题…...

win10彻底永久关闭自动更新的方法

win10彻底永久关闭自动更新的方法 文章目录 win10彻底永久关闭自动更新的方法一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务 可以参考这个视频的做法&#xff1a; 教学视频搬用 一、禁用Windows Update服务 1、同时按下键盘 Win R&#xff0c;打开运行…...

【webpack】初始化

webpack 旧项目的问题下一代构建工具 Vite 主角 &#xff1a;webpack安装webpack1&#xff0c;mode的选项2&#xff0c;使用source map 精准定位错误行数3&#xff0c;使用watch mode(观察模式)&#xff0c;自动运行4&#xff0c;使用webpack-dev-server工具&#xff0c;自动刷…...

服务器GPU占用,kill -9 PID 用不了,解决办法

PID&#xff08;progress ID 进程ID&#xff09; 上图为占用情况&#xff0c;使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法&#xff0c;一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…...

Vue学习笔记-Vue3中的toRaw和markRaw

toRaw 作用&#xff1a;将一个由reactive生成的响应式对象转为普通对象 导入&#xff1a; import {toRaw} from vue 使用方法&#xff1a; let data reactive({k1:v1,k2:v2 }) //将对象变为非响应式的普通对象 let raw_data toRaw(data)使用场景&#xff1a;用于读取响应式…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...