JVM虚拟机(五)强引用、软引用、弱引用、虚引用
目录
- 一、强引用
- 二、软引用
- 三、弱引用
- 四、虚引用
- 五、总结
引文:
在 Java 中一共存在 4 种引用:强、软、弱、虚。它们主要指的是,在进行垃圾回收的时候,对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用。
一、强引用
强引用
:只有所有 GC Root 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收。
强引用是比较常见的,比如说下面这段代码种,这个 user 就是强引用:
User user = new User();
强引用的特点有哪些呢?如下图所示:

现在有一个 GC Root,我们之前讲过 GC Root 是用来定位哪些对象是存活的。
- 假如说 GC Root 关联到了 User 对象,那就证明这个 User 对象是存活的,则这个 User 对象一直都不会被垃圾回收,即使出现了内存不足,抛出 OOM 异常,也不会回收强引用的对象。
- 只有当 GC Root 不再关联 User 对象,那这个对象才有可能会被垃圾回收器进行回收。
以上就是强引用的特点。
二、软引用
软引用
:仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次触发垃圾回收。
我们先来看一段代码:
User user = new User();
SoftReference softReference = new SoftReference(user);
在这段代码中,我们先创建了一个 User 对象,然后又创建了一个 SoftReference
对象并且包装了 User 对象。它们的关系如下图所示:

首先 GC Root 能够关联到 SoftReference 对象,然后当前的 SoftReference 又会关联 User 对象。大家注意,SoftReference 对象和 User 对象之间的关联是使用的虚线,因为这种关联属于软引用。
在进行垃圾回收的时候,一开始并不会对 user 对象进行垃圾回收。由于 user 对象是一个软引用,如果在第一次垃圾回收之后内存还是不够,马上又进行了一次垃圾回收,这个时候软引用 User 对象就会被垃圾回收器回收了。
以上就是软引用的介绍,它必须配合 SoftReference 进行使用。
三、弱引用
弱引用
:仅有弱引用引用该对象时,在垃圾回收的时候,无论内存是否充足,都会回收弱引用对象。
弱引用和软引用的使用有些类似,我们来看这样一段代码:
User user = new User();
WeakReference weakReference = new WeakReference(user);
在这段代码中,先创建了一个 User 对象,然后创建了一个 WeakReference
对象并且包装了 User 对象,他们的关系如下图所示:

首先,GC Root 关联到的是 WeakReference 对象,然后由 WeakReference 对象去关联了 User 对象,这里也是用虚线表示的。目前这个 User 对象就是一个弱引用。
在进行垃圾回收的时候。一旦内存不够用了,User 对象作为一个弱引用对象,就会被垃圾回收器回收掉。
关于弱引用有一个经典的例子,就是 ThreaLocal 内存泄露的问题:
在 ThreadLocal 中有一个 Entry 对象,它继承了 WeakReference,然后在构造函数里面调用了 super(k) 方法,也就表示了当前构造函数中的 ThreadLocal<?> 是一个弱引用,一旦内存不够的时候进行了垃圾回收,就会把 k 对象回收掉。但是 value 使用的是 = 进行赋值,就是一个强引用,并不会被垃圾回收器进行回收。所以说这块儿就可能产生内存泄漏。
以上就是弱引用的说明。
四、虚引用
虚引用
:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存。
为了方便理解,我们来看这样一段代码:
User user = new User();
ReferenceQueue referenceQueue = new ReferenceQueue();
PhantomReference phantomReference = new PhantomReference(user, referenceQueue);
在这段代码中,先创建了一个 User 对象,然后创建了一个 ReferenceQueue
对象(就是一个引用队列),最后创建了一个 PhantomReference
对象并且包装了 User 对象和 ReferenceQueue 对象。它们之间的关系如下图所示:
首先,GC Root 直接关联的是 PhantomReference 虚引用对象,一个是 X,另一个是 Y。这两个 PhantomReference 对象分别去引用了 User1 对象和 User2 对象。
大家可能会想,这里面哪里能体现 ReferenceQueue 队列呢?是这样的,将来如果发生了垃圾回收,把 User1 和 User2 这两个对象回收掉了,那么 PhantomReference 虚引用对象本身在进行垃圾回收发生的时候,会把虚引用对象 X 和 Y 加入到 ReferenceQueue 引用队列中,如下图所示:
把 X 和 Y 虚引用对象加入到 ReferenceQueue 引用队列中之后,引用队列就会配合 Reference Handler
这个线程来去释放虚引用对象所关联的一些外部资源。
比如说 User1 和 User2 已经被垃圾回收掉了,但是回收这两个对象只是释放了 Java 的堆内存资源,它们在使用的过程中有可能会使用一些外部的资源,这些外部资源有可能不是 Java 的内存,有可能使用的是系统的直接内存,那这些内存什么时候释放呢?这些内存必须要等 Java 对象回收掉之后,才能去释放这些外部的资源内存。所以说就需要把这些虚引用对象放入到引用队列中,先记录哪些对象被回收了,然后由 Reference Handler 根据队列的内容去回收资源就可以了。比如我们示例中的 X 和 Y 两个虚引用对象,它们关联的 User 对象已经被回收掉了,这个时候我们也应该把 X 和 Y 对应的外部资源进行释放,有一个专门的线程来进行释放,就叫 Reference Handler。它就会去从引用队列中不断地把这些虚引用对象 X 和 Y 取出来,然后把它们占用的外部资源进行释放。
以上就是虚引用对象的说明了,它需要配合 ReferenceQueue 引用队列才能使用。
补充: 软引用和弱引用也可以通过引用队列去释放自身的资源。
下面我们总结一下这四种引用类型。
五、总结
强引用、软引用、弱引用、虚引用的区别?
- 强引用:比较常见,只要 GC Root 能关联到,就不会被回收。
- 软引用:需要配合 SoftReference 使用,当垃圾被多次回收,内存依然不够的时候会回收软引用对象。
- 弱引用:需要配合 WeakReference 使用,只要进行了垃圾回收,就会把弱引用对象回收。
- 虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存等外部资源。
整理完毕,完结撒花~🌻
相关文章:

JVM虚拟机(五)强引用、软引用、弱引用、虚引用
目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文: 在 Java 中一共存在 4 种引用:强、软、弱、虚。它们主要指的是,在进行垃圾回收的时候,对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…...
(最新)itext7 freemarker动态模板转pdf
1.引入依赖 <!--PDF导出POM--> <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>8.0.3</version><type>pom</type> </dependency> <dependency><grou…...

solidworks electrical 2D和3D有什么区别
SolidWorks Electrical 是一款专为电气设计开发的软件工具,它提供了两种主要的工作环境:2D电气设计和3D电气集成设计。两者在功能和应用场景上存在显著的区别: SolidWorks Electrical 2D 设计 特点与用途: SolidWorks Electrica…...
4.2、ipex-llm(原bigdl-llm)进行语音识别
ipex-llm环境配置及模型下载 由于需要处理音频文件,还需要安装用于音频分析的 librosa 软件包。 pip install librosa下载音频文件 !wget -O audio_en.mp3 https://datasets-server.huggingface.co/assets/common_voice/--/en/train/5/audio/audio.mp3 !wget -O a…...

上海亚商投顾:创业板指低开低走 黄金、家电股逆势大涨
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指4月12日震荡调整,创业板指尾盘跌超1%。黄金板块延续强势,莱绅通灵9连板࿰…...

AIGC革新浪潮:大语言模型如何优化企业运营
在当今快速发展的商业环境中,企业对于有效管理知识资产的需求日益增长。知识管理作为企业核心竞争力的关键组成部分,对于提高决策质量、增强创新能力和优化运营流程起着至关重要的作用。随着数字化转型的推进,企业对知识管理系统提出了新的要…...
Golang基础-12
Go语言基础 介绍 目录操作 创建 删除 重命名 遍历目录 修改权限 文件操作 创建 打开关闭 删除 重命名 修改权限 读文件 写文件 文件定位 拷贝 测试 单元测试 基准测试 示例 介绍 本文介绍Go语言中目录操作(创建目录、删除目录、重命名、遍历…...
python递归统计文件夹下pdf文件的数量
python递归统计文件夹下pdf文件的数量 import os from docx import Documentdef count_all_pages(root_dir):total_pages 0# 遍历文件夹for dirpath, dirnames, filenames in os.walk(root_dir):for filename in filenames:# if filename.endswith(.docx) or filename.endswit…...
Kafka 硬件和操作系统
目录 一. 前言 二. Kafka 硬件和操作系统(Hardware and OS) 2.1. 操作系统(OS) 2.2. 磁盘和文件系统(Disks and Filesystem) 一. 前言 Kafka 是 I/O 密集型而非计算密集型的框架,所以对 CP…...
Kolla-ansible部署OpenStack集群
0. OpenStack 部署 系统要求 单机部署最低配置: 2张网卡8G内存40G硬盘空间 主机系统: CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统,我这里使用的是R…...

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用
在地质灾害的紧急关头,救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时,倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO,这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机,以其卓越的性能和功能&#…...
MATLAB算法实战应用案例精讲-【数模应用】中介效应分析(补充篇)(附R语言和python代码实现)
目录 前言 几个高频面试题目 中介效应分析与路径分析的区别 1.中介效应分析 2.路径分析 注意事项...

Day96:云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸
目录 云原生-Docker安全-容器逃逸&系统内核漏洞 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE-2019-5736 runC容器逃逸(需要管理员配合触发) CVE-2020-15257 containerd逃逸(启动容器时有前提参数) 云原生-Docker安全-容器逃逸&CDK自动化 知识点࿱…...

python botos s3 aws
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html AWS是亚马逊的云服务,其提供了非常丰富的套件,以及支持多种语言的SDK/API。本文针对其S3云储存服务的Python SDK(boto3)的使用进行介绍。 …...

python画神经网络图
代码1(画神经网络连接图) from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库,完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …...
Bash 编程精粹:从新手到高手的全面指南之逻辑控制
在 Unix 和 Linux 系统中,Bash(Bourne-Again Shell)是一种广泛使用的 shell,提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构,包括条件判断、分支选择、循环控制以及退出控制等内容。 条件判断&…...
自动化运维(三十)Ansible 实战之自定义插件
Ansible 自定义插件允许你扩展其功能,以满足特定的自动化需求。Ansible 支持多种类型的插件开发,如动态库存、查找、回调、过滤器、变量等。这里我们将通过实例,介绍如何开发、部署和使用一个自定义插件。 开发自定义查找插件 查找插件用于在 Ansible 任务中动态获取数据。…...

实习僧网站的实习岗位信息分析
目录 背景描述数据说明数据集来源问题描述分析目标以及导入模块1. 数据导入2. 数据基本信息和基本处理3. 数据处理3.1 新建data_clean数据框3.2 数值型数据处理3.2.1 “auth_capital”(注册资本)3.2.2 “day_per_week”(每周工作天数…...

C语言中局部变量和全局变量是否可以重名?为什么?
可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…...

小程序中配置scss
找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...