Java 中的强引用、弱引用、软引用和虚引用

news2024/11/26 5:52:06

一、继承结构

1.1 四大引用的继承关系 

在 Java 中一共有四种引用类型,分别是强引用、弱引用、软引用和虚引用,其中,我们常用的是强引用,而其他三种引用都需要引入特定的 java.lang.ref 才能使用,他们的继承结构如下:

引用继承结构图

 一般只有强引用是直接使用的,而其他的三种引用都需要配合引用队列(ReferenceQueue)来使用会更好。

Java 中变量的类型有两大类,值类型和引用类型,这里的引用类型就是指可以引用的对象。在对引用类型进行操作时,我们实际只是得到了它的内存地址,通过内存地址来访问这个对象,并对其进行相关的操作,这和 C++ 的指针极为相似,但不完全相同。C++ 有基础数据类型的指针,而 Java 没有基础数据类型的引用,取而代之的是值类型。

1.2 引用和指针的关系

这里拓展和延伸一下,具体解释 C++ 中的指针、引用和 Java 的引用之间的区别和联系。

C++ 的指针

C++ 中的指针指向对象的内存地址,在参数传递时,以指针传递时只会将对象的内存地址传过去,在函数或方法内部再对地址进行访问以达到传参的目的。

Java 的引用

Java 中的引用和 C++ 中的指针类似,但是也不完全相同。Java 中的引用没有基础类型的引用,只能是引用类型,因此相比于 C++,没有 int 类型变量的地址一说,Java 只能得到引用类型的地址,无法得到基本数据类型的内存地址。

C++ 的引用

C++ 中也是有引用的,不过 C++ 的引用和指针以及 Java 的引用不同,它是变量或者对象的别名,和拷贝不一样,它是直接对原本的数据进行操作的。

二、四大引用方式

2.1 强引用(Reference)

使用强引用不需要引入任何包,Java 的引用方式默认就是强引用。

我们一般使用的引用都是强引用,当内存不足时,JVM 开始回收垃圾,但对于强引用的对象,JVM 不会对其进行回收,就算出现了 OOM(OutOfMemory),JVM 也不会对其进行回收,也就是说,强引用的对象是不会被 JVM 给回收的。这可以防止一些资源在程序运行的时候被回收了,当然,有利也有弊,当一些资源过大时,它们会占用大量的内存,甚至出现了 OOM 时,JVM 依然不会对其回收,这可能导致程序出现问题。在某些情况下,这会造成程序的内存泄露。

2.2 软引用(SoftReference)

使用软引用需要引入 java.lang.ref.SoftReference。

软引用不像强引用那么绝对,当内存不足时,JVM 就会尝试回收垃圾,而软引用的对象在这个时候就会被回收。不过,若没有达到内存不足的情况,JVM 不会回收软引用的对象。软引用的这个特性非常好,可以说它就是 Java 自动管理内存的标配,为什么这么说呢?我们知道,Java 是可以自动管理内存的,但在程序的运行过程中,JVM 是无法自动判断某些内存空间的,而这部分空间如果都是强引用对象且占用了很大的内存,甚至导致出现了 OOM,那么程序就出问题。这个时候,程序员就应该将其设定为软引用,告诉 JVM,这个对象在内存不足的时候是可以释放的。图片资源的缓存,网页资源的缓存中就大量使用了软引用。

2.3 弱引用(WeakReference)

使用弱引用需要引入 java.lang.ref.WeakReference。

弱引用,是一种比软引用还要“弱”的引用方式。当 Java 的垃圾回收机制开始运行时,弱引用的对象就会立刻被回收,无论内存是否充足。弱引用一般使用不多。

2.4 虚引用(PhantomReference)

使用虚引用需要引入 java.lang.ref.PhantomReference。

虚引用,顾名思义,其引用是虚的,并非真实的引用,因此可以认为这个对象没有任何引用,这个对象也无法通过虚引用被访问。虚引用对象在任何时候都可能被回收。虚引用可以理解为给这个对象打了个标记,程序员可以从中知道,这个对象要被回收或者已经被回收,虚引用的存在只是象征着这个对象曾经存在过。

三、总结

以上四种引用方式可以总结为下表:

引用方式内存不足时垃圾回收机制启动时其余情况
强引用
软引用
弱引用
虚引用可能可能可能

在一般的程序中,弱引用和虚引用很少会被用到,强引用天天都在用就不必我说了,在有些情况下(如资源文件很大,但并不是全部要在同一时刻使用)我们会使用软引用来代替原来的强引用,一是可以避免某些情况下产生的 OOM,此外,它可以减少程序使用的内存,加速程序的运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货分享:制作婚礼请柬的技巧,从零基础起步

在现代社会,婚礼请柬已经成为了婚礼必备的一部分。而如何制作一个个性化的婚礼请柬呢?今天,我们将分享一个简便而可靠的制作方法,那就是使用乔拓云平台。 乔拓云平台是一个可靠的第三方制作工具,提供了丰富的H5模板&am…

教你如何为博客网站申请阿里云的免费域名HTTPS证书

如何为博客网站申请阿里云的免费域名HTTPS证书 文章目录 如何为博客网站申请阿里云的免费域名HTTPS证书前置条件:步骤1 例如阿里云控制台,选择SSL证书步骤2 申请购买免费证书步骤3 创建证书步骤3.1 证书申请步骤3.2 DNS域名验证 步骤4 等待证书审核成功&…

徐明君:品牌定位塑造独特价值与关键差异的新思维

在当今竞争激烈的市场环境中,品牌定位已成为企业生存与发展的关键要素。近年来,随着消费者需求的不断变化和市场的持续发展,品牌定位的内涵和方法也在不断演进。本文将探讨品牌定位的核心概念、作用以及如何有效运用品牌定位策略,…

手把手指点用piwigo与cpolar结合共同搭建一个能分享的旅行相册网站

文章目录 前言1. 使用piwigo这款开源的图片管理软件2. 需要将piwigi网页复制到phpstudy3. “开始安装”进入自动安装程序4. 创建新相册5. 创建一条空白数据隧道6.将cpolar云端保留的空白数据隧道与本地piwigo网页关联起来总结 前言 每逢节假日到各处去旅行,到不同的…

Nuxt.js快速上手

Nuxt.js快速上手 Nuxt.js快速上手1、为什么用nuxtvue-cli本身问题预渲染服务端渲染(通过SSR)项目解决seo的方案选择 2、Nuxt安装和使用Nuxt安装和使用nuxt安装和目录结构nuxt生命周期nuxt路由nuxt导航守卫nuxt Vuex状态树 3、Nuxt配置项nuxt配置之headnuxt配置之cssnuxt配置之p…

如何有效开展网络安全事件调查工作

网络安全事件调查是现代企业网络安全体系建设的关键组成部分。为了防止网络攻击,仅仅关注于安全工具的应用效果远远不够,因为安全事件一直都在发生。安全团队只有充分了解攻击者的行踪和攻击路径,才能更好地防范更多攻击时间的发生。 做好网…

Ffmpeg分布式视频转码问题总结

云原生分布式转码 在计算资源招之即来的云计算时代,正在重构着软件架构的方方面面。 对软件架构师或者运维管理者影响比较大的一个点便是不需要在做容量规划,不需要提前评估为了应对某个活动应该准备多少台机器,这个特点也深刻影响软件架构的…

航顺HK32F030M怎么样 航顺HK32F030M应用领域介绍

航顺HK32F030M是一款基于ARM Cortex-M0内核的32位微控制器,具有高性能、低功耗、经济适用等特点。以下是颖特新关于航顺HK32F030M的详细介绍: 一、性能表现 航顺HK32F030M采用ARM Cortex-M0内核,主频最高可达64MHz,具有出色的计算…

操作系统-笔记-第一章

目录 一、第一章——操作系统的概念 1、操作系统的概念、功能 (1)层次 (2)总结 2、操作系统的特征(4个) (1)并发与并行 (2)共享与互斥 (3…

vite创建打包预览Vue3流程

本文章只是走了一下创建》运行》打包》预览打包效果的流程步骤,不包含创建后配置vue3项目和打包优化等。 1.使用vite创建vue3项目 创建项目命令: npm init vitelatest写完项目名称后回车 键盘上下键选择Vue构建 根据项目需求选择ts还是js 创建完成 根…

在docker中安装nacos,很详细

在docker中安装nacos,很详细 一、安装docker二、拉取nacos镜像1、查看有那些nacos镜像2、获取最新版本镜像3、获取指定版本的镜像4、查看本地镜像5、删除镜像 三、创建挂载目录1、创建nacos配置文件挂载目录2、创建nacos日志文件挂载目录3、创建nacos数据文件挂载目…

大数据分析案例-基于KMeans和DBSCAN算法对汽车行业客户进行聚类分群

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

W6100-EVB-PICO 做UDP Server进行数据回环测试(七)

前言 前面我们用W6100-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么?什么是UDP Server?能干什么? UDP (User Dataqram P…

安全问题「一锅端」,数据安全风险评估落地实践

数据安全风险评估是《数据安全法》明确的数据安全基础制度之一,也是重要数据处理者应尽的数据安全保护义务。今年5月,《网络安全标准实践指南—网络数据安全风险评估实施指引》发布,作为数据安全领域的一项重磅级指引,明确提出了网…

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…

11. Docker Swarm(二)

1、前言 上一篇中我们利用Docker Swarm搭建了基础的集群环境。那么今天我们就来验证以下该集群的可用性。上一篇的示例中,我创建了3个实例副本,并且通过访问http://192.168.74.132:8080得到我们的页面。 2、验证高可用 1)我们可以通过以下命…

arco-cli脚手架创建项目时,踩坑点及解决办法

项目场景: 提示:这里简述项目相关背景: arco-cli安装新建项目时,前期很顺利,参考官网示例,都没问题的! arco创建arco-pro项目示例:https://arco.design/vue/docs/pro/start 如果遇见问题管方…

2023年8月中国数据库排行榜:TiDB 重夺榜眼,PolarDB 再进一位

斗力频催鼓、争都更少筹。 2023年8月的 墨天轮中国数据库流行度排行 在炎炎夏日中火热出炉,本月共有286个数据库参与排名。本月排行榜前十中,头部变动加剧。TiDB 发奋图强重夺榜眼,阿里云PolarDB 排名连续上升,其余数据库稳居原位…

代理模式【Proxy Pattern】

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代…

数据结构与算法-链表(含经典面试题)

一 面试经典: 1. 如何设计一个LRU缓存淘汰算法?基础 思想:新加的点来了, 首先去链表里面遍历,如果找到了。删掉 然后插入到头部。头部就是最新的吧如果不在原来的链表里:如果有空间就插入头部。LRU有内存限制的&#x…