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

java的强,软,弱,虚引用介绍以及应用

写在前面

本文看下Java的强,软,弱,虚引用相关内容。

1:各种引用介绍

顶层类是java.lang.ref.Reference,注意是一个抽象类,而不是接口,其中比较重要的引用队列ReferenceQueue就在该类中定义,子类们共同使用:

// java.lang.ref.Reference
public abstract class Reference<T> {// ...volatile ReferenceQueue<? super T> queue;// ...
}

另,以下测试案例使用的gc配置:

-Xms10m -Xmx10m -XX:+PrintGC

1.1:强引用

平时我们用的默认就是强引用。所以也就没有一个类似于StrongReference的类来代表强引用了。

1.2:软引用

使用类SoftReference代表一个软引用,比强引用稍微弱化些,在内存空间充足时发生GC不会被回收,但是在内存不足发生GC时将会被回收,所以适合用在类似于缓存这种并不会对程序起到决定性作用的场景中。如下例子:

public void softRefTest() {/**** @author mikechen*/Object obj = new Object();SoftReference softRef = new SoftReference<Object>(obj);obj = null;//删除强引用byte[] b = new byte[1024 * 1024];System.gc();//调用gcSystem.out.println("gc之后的值:" + softRef.get()); // 对象依然存在
}

运行:

[GC (System.gc())  2663K->1713K(9728K), 0.0011382 secs]
[Full GC (System.gc())  1713K->1647K(9728K), 0.0055792 secs]
gc之后的值:java.lang.Object@330bedb4Process finished with exit code 0

这里内存不足的场景我没有试出来,要么就OOM了。

软引用也可以选择和ReferenceQueue来一起使用,当软应用关联的对象被GC之后就会将软引用本身添加到队列中,如下:

public void softRefWithQueue() throws Exception {ReferenceQueue<Object> queue = new ReferenceQueue<>();Object obj = new Object();SoftReference softRef = new SoftReference<Object>(obj, queue);//删除强引用obj = null;//调用gcSystem.gc();System.out.println("gc之后的值: " + softRef.get()); // 对象依然存在,虽然GC但内存足够,不会回收//申请较大内存使内存空间使用率达到阈值,强迫gcbyte[] bytes = new byte[1024 * 1024 * 6];//如果obj被回收,则软引用会进入引用队列System.out.println("111");//调用gcSystem.gc();Reference<?> reference = queue.remove(); // 因为没有触发内存不足的场景,所以不会添加到队列中,所以这里会卡着System.out.println("222");if (reference != null) {System.out.println("对象已被回收: " + reference.get());// 对象为null}
}

运行:
在这里插入图片描述
同样试不出来内存不足被回收的场景。

1.3:弱引用

弱引用和软引用的区别是在发生GC时不管内存是否足够,都会被回收,看个例子:

    private void weakRef() {Object o1 = new Object();WeakReference<Object> w1 = new WeakReference<Object>(o1);//        System.out.println(o1);System.out.println(w1.get()); // 因为此时还有强引用,肯定不会被回收o1 = null; // 手动去除强引用System.gc();//        System.out.println(o1);System.out.println("因为发生了GC,所以就被回收掉了:");System.out.println(w1.get()); // 因为发生了GC,所以就被回收掉了
}

运行:

java.lang.Object@330bedb4
[GC (System.gc())  1570K->745K(9728K), 0.0010741 secs]
[Full GC (System.gc())  745K->622K(9728K), 0.0059361 secs]
因为发生了GC,所以就被回收掉了:
nullProcess finished with exit code 0

当然也可以和ReferenceQueue一起使用,来监听对象被回收的动作:

private void weakRefWithQueueV1() throws Exception {CC o1 = new CC();o1.setName("张三");ReferenceQueue referenceQueue = new ReferenceQueue();Map<WeakReference, String> map = new HashMap<>();WeakReference<CC> w1 = new WeakReference<CC>(o1, referenceQueue);map.put(w1, w1.get().getName());
//    System.out.println(w1);
//
//    System.out.println(o1);System.out.println(w1.get()); // 因为此时还有强引用,肯定不会被回收o1 = null; // 手动去除强引用System.gc();//        System.out.println(o1);System.out.println("因为发生了GC,所以就被回收掉了:");System.out.println(w1.get()); // 因为发生了GC,所以就被回收掉了final Reference ref = referenceQueue.remove();System.out.println(map.get(ref) + " 被回收了"); // 因为对象被回收,所以弱引用对象本身会被放到队列中
}

运行:

org.example.Main$CC@2503dbd3
[GC (System.gc())  1647K->709K(9728K), 0.0009438 secs]
[Full GC (System.gc())  709K->628K(9728K), 0.0058506 secs]
因为发生了GC,所以就被回收掉了:
null
张三 被回收了Process finished with exit code 0

1.4:虚引用

虚引用是最弱的的一种引用,不决定对象的生命周期,有跟没有一样,即形同虚设,必须和ReferenceQueue共同使用,一般用来监控jvm的gc活动,如下例子:

private void weakPhantomWithQueueV1() throws Exception {CC o1 = new CC();o1.setName("张三1");ReferenceQueue referenceQueue = new ReferenceQueue();Map<PhantomReference, String> map = new HashMap<>();PhantomReference<CC> w1 = new PhantomReference<CC>(o1, referenceQueue);map.put(w1, o1.getName());
//        System.out.println(w1);//        System.out.println(o1);System.out.println(w1.get()); // 因为此时还有强引用,肯定不会被回收o1 = null; // 手动去除强引用System.gc();//        System.out.println(o1);System.out.println("因为发生了GC,所以就被回收掉了:");System.out.println(w1.get()); // 因为发生了GC,所以就被回收掉了final Reference ref = referenceQueue.remove();System.out.println(map.get(ref) + " 被回收了"); // 因为对象被回收,所以弱引用对象本身会被放到队列中
}

运行:

null
[GC (System.gc())  1643K->741K(9728K), 0.0012171 secs]
[Full GC (System.gc())  741K->627K(9728K), 0.0062680 secs]
因为发生了GC,所以就被回收掉了:
null
张三1 被回收了Process finished with exit code 0

2:在框架中的应用

2.1:在netty中的应用

just go。

2.2:在mybatis中的应用

TODO

写在后面

参考文章列表

Java四大引用详解:强引用、软引用、弱引用、虚引用 。

netty之内存泄露检测。

相关文章:

java的强,软,弱,虚引用介绍以及应用

写在前面 本文看下Java的强&#xff0c;软&#xff0c;弱&#xff0c;虚引用相关内容。 1&#xff1a;各种引用介绍 顶层类是java.lang.ref.Reference,注意是一个抽象类&#xff0c;而不是接口&#xff0c;其中比较重要的引用队列ReferenceQueue就在该类中定义&#xff0c;子…...

STL-stack栈:P1981 [NOIP2013 普及组] 表达式求值

这个题用的STL-栈来做 题目来源&#xff1a;洛谷 相关知识 [NOIP2013 普及组] 表达式求值 题目背景 NOIP2013 普及组 T2 题目描述 给定一个只包含加法和乘法的算术表达式&#xff0c;请你编程计算表达式的值。 输入格式 一行&#xff0c;为需要你计算的表达式&#xff…...

Java使用stream进行分组汇总失效问题

背景 在当前项目的开发任务中需要定制财务报表导出功能&#xff0c;格式比较特殊使用了VM。在汇总数据的过程中使用了stream.collect 进行分组汇总。在测试的过程中发现分组失败&#xff0c;最终原因是对象的对比方式问题&#xff0c;collect是根据对象对比的所以需要重写equa…...

VMWare虚拟机安装华为欧拉系统

记录一下安装步骤&#xff1a; 1.在vmware中创建一个新的虚拟机&#xff0c;步骤和创建centos差不多 2.启动系统 具体的看下图&#xff1a; 启动虚拟机 耐心等待 等待进度条走完重启系统就完成了...

阿里云轻量应用服务器可以用在哪些场景呢

在数字化转型的浪潮中&#xff0c;中小企业面临着如何快速、高效地上云的挑战。阿里云轻量应用服务器&#xff08;SWAS&#xff09;作为一款专为中小企业设计的云服务产品&#xff0c;提供了简单易用、经济实惠的解决方案&#xff0c;助力企业轻松实现云端部署&#xff0c;赋能…...

OrangePi 5plus yolov5 部署全过程

准备工作 一、下载用户手册 下载-Orange Pi官网-香橙派&#xff08;Orange Pi&#xff09;开发板,开源硬件,开源软件,开源芯片,电脑键盘 里面有详细的镜像烧录教程和桌面使用等 二、镜像下载 准备一张TF卡&#xff08;32G以上&#xff09;&#xff0c;插入电脑&#xff0c…...

Rust中::和.的区别

在 Rust 中&#xff0c;:: 和 . 是两种常用的操作符&#xff0c;它们的作用和语法用途不同。以下是详细的对比和解释&#xff1a; 1. ::&#xff08;双冒号&#xff09; :: 是 路径操作符&#xff0c;主要用于访问模块、结构体、枚举、函数、常量等的命名空间中的成员。 主要…...

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…...

VS Code 更改背景颜色

我们的 VS code 默认是 黑色&#xff0c;这个颜色在有光的情况下&#xff0c;个人感觉反光比较严重。 所以换成白色了。 步骤&#xff1a; 选择 File -> Preferences -> Settings Workbench -> Appearance -> Color Theme -> 选择喜欢的颜色 选择后会变为你选…...

OpenAI 助力数据分析中的模式识别与趋势预测

数据分析师的日常工作中&#xff0c;发现数据中的隐藏模式和预测未来趋势是非常重要的一环。借助 OpenAI 的强大语言模型&#xff08;如 GPT-4&#xff09;&#xff0c;我们可以轻松完成这些任务&#xff0c;无需深厚的编程基础&#xff0c;也能快速上手。 在本文中&#xff0…...

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下&#xff0c;当安装IDM软件后&#xff0c;该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上&#xff0c;但在某些情况下&#xff0c;需要我们手动安装&#xff0c;以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…...

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…...

分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下&#xff0c;IM 系统采用分层架构方式&#xff0c;如下图。 分层架构的 IM 系统&#xff0c;整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】&#xff0c;我们在上篇文章&#xff08;分层架构 IM 系…...

基于YOLOv8深度学习的医学影像阿尔兹海默症检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)

阿尔茨海默症&#xff08;Alzheimer’s disease&#xff09;是一种常见的神经退行性疾病&#xff0c;主要表现为记忆丧失、认知能力下降以及行为和人格改变。随着全球老龄化问题的加剧&#xff0c;阿尔茨海默症的发病率也在逐年上升&#xff0c;给患者及其家庭带来了巨大的经济…...

【支持向量机(SVM)】:相关概念及API使用

文章目录 1 SVM相关概念1.1 SVM引入1.1.1 SVM思想1.1.2 SVM分类1.1.3 线性可分、线性和非线性的区分 1.2 SVM概念1.3 支持向量概念1.4 软间隔和硬间隔1.5 惩罚系数C1.6 核函数 2 SVM API使用2.1 LinearSVC API 说明2.2 鸢尾花数据集案例2.3 惩罚参数C的影响 1 SVM相关概念 1.1…...

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…...

时序数据库TDEngine

TDengine 是一款开源、高性能、云原生的时序数据库&#xff08;Time Series Database, TSDB&#xff09;, 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计。同时它还带有内建的缓存、流式计算、数据订阅等系统功能&#xff0c;能大幅减少系统设计的复杂度&…...

jd-easyflow中inclusive的用法

在jd-easyflow中&#xff0c;inclusive通常与流程中的条件分支&#xff08;conditions&#xff09;配置相关&#xff0c;用于控制多个条件分支的执行逻辑。当conditionType设置为inclusive时&#xff0c;表示多个条件分支中的所有条件都会被评估&#xff0c;而不是像exclusive那…...

sqlmap图形化安装使用(附文件)

1.需要python环境&#xff0c;我这里就不教如何安装python环境了。 2.下载压缩包并且解压 3. 凭自己喜好选择大窗口小窗口 4.进入图形化界面后&#xff0c;1.输入url地址。2.选择要执行的操作。3.构造命令语句 5.点击一把梭&#xff0c;然后就可以发现出结果了 6. 对于喜欢自己…...

从二维到一维:动态规划矩阵问题的优化之道

动态规划中的矩阵问题是非常经典的应用场景&#xff0c;比如最小路径和问题。这类问题很自然地可以想到使用二维 dp 数组来求解。 我们定义&#xff1a; dp[i][j] 表示从矩阵的第 i行第 j列到右下角的最小路径和。 基本解法 求解过程从右下角开始&#xff0c;向左上角遍历&am…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...