java引用相关(四大引用类型,软引用避免oom,弱引用表,虚引用和引用队列,可达性分析算法)
1. 什么是引用?
问题:什么是引用?Java中的引用是如何工作的?
答案:
- 引用 是对象的句柄,用于访问堆内存中的对象。
- 在Java中,引用变量实际上存储的是对象的地址,而不是对象本身。
- 通过引用,可以访问对象的属性和方法。
2. Java中的引用类型有哪些?
问题:Java中有哪几种引用类型?
答案:
- 强引用(Strong Reference):最常见的引用类型,如
Object obj = new Object()
。只要强引用存在,垃圾回收器就不会回收被引用的对象。 - 软引用(Soft Reference):通过
SoftReference
类实现。在内存不足时,垃圾回收器会回收软引用指向的对象。 - 弱引用(Weak Reference):通过
WeakReference
类实现。垃圾回收器在每次垃圾回收时都会回收弱引用指向的对象。 - 虚引用(Phantom Reference):通过
PhantomReference
类实现。虚引用不会影响对象的生命周期,主要用于在对象被垃圾回收时收到通知。
3. 强引用和软引用有什么区别?
问题:强引用和软引用有什么区别?
答案:
- 强引用:只要强引用存在,垃圾回收器就不会回收被引用的对象。即使内存不足,也不会回收强引用的对象,可能会导致
OutOfMemoryError
。 - 软引用:在内存不足时,垃圾回收器会回收软引用指向的对象。软引用通常用于实现内存敏感的缓存。
4. 什么是弱引用?它的应用场景是什么?
问题:什么是弱引用?它的应用场景是什么?
答案:
- 弱引用:通过
WeakReference
类实现。垃圾回收器在每次垃圾回收时都会回收弱引用指向的对象。 - 应用场景:
- 缓存:用于实现内存敏感的缓存,当内存不足时,可以自动释放缓存对象。
- 监听器:在事件处理中,为了避免内存泄漏,可以使用弱引用来存储监听器。
5. 什么是虚引用?它的应用场景是什么?
问题:什么是虚引用?它的应用场景是什么?
答案:
- 虚引用:通过
PhantomReference
类实现。虚引用不会影响对象的生命周期,主要用于在对象被垃圾回收时收到通知。 - 应用场景:
- 资源清理:在对象被垃圾回收时,执行一些资源清理工作,如关闭文件句柄、释放资源等。
6. 如何判断一个对象是否被垃圾回收了?
问题:如何判断一个对象是否被垃圾回收了?
答案:
- 可以使用
PhantomReference
来判断对象是否被垃圾回收。当对象被垃圾回收时,PhantomReference
的get
方法会返回null
。 - 可以将
PhantomReference
添加到ReferenceQueue
中,当对象被垃圾回收时,ReferenceQueue
会收到通知。
7. 引用传递是按值传递还是按引用传递?
问题:Java中的引用传递是按值传递还是按引用传递?
答案:
- 按值传递:Java中的参数传递是按值传递的。对于基本类型,传递的是值的副本;对于引用类型,传递的是引用的副本。
- 按引用传递的副本:传递的是对象引用的副本,而不是对象本身。因此,可以通过引用修改对象的状态,但不能改变引用本身。
8. 如何避免内存泄漏?
问题:如何避免内存泄漏?
答案:
- 及时释放引用:不再使用的对象要及时释放引用,避免长时间持有无用对象的引用。
- 使用弱引用:在缓存和监听器等场景中,使用弱引用来避免内存泄漏。
- 静态变量谨慎使用:静态变量的生命周期与类相同,容易导致内存泄漏。
- 关闭资源:及时关闭文件句柄、数据库连接等资源,避免资源泄漏。
9. 什么是引用计数法?Java的垃圾回收器是否使用引用计数法?
问题:什么是引用计数法?Java的垃圾回收器是否使用引用计数法?
答案:
- 引用计数法:每个对象都有一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1。当计数器为0时,对象可以被回收。
- Java的垃圾回收器:Java的垃圾回收器不使用引用计数法,而是使用可达性分析算法(Reachability Analysis)。通过从根节点(如栈帧中的局部变量表、方法区中的类静态属性)出发,遍历所有可达对象,未被遍历到的对象被视为垃圾,可以被回收。
10. 什么是可达性分析算法?
问题:什么是可达性分析算法?
答案:
- 可达性分析算法:从一系列称为“GC Roots”的对象开始,向下搜索,走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,证明此对象是不可达的,可以被垃圾回收。
- GC Roots:包括栈帧中的局部变量表、方法区中的类静态属性、本地方法栈中的JNI引用等。
11. 什么是弱引用表?它在垃圾回收中的作用是什么?
问题:什么是弱引用表?它在垃圾回收中的作用是什么?
答案:
- 弱引用表:垃圾回收器在进行垃圾回收时,会维护一个弱引用表,记录所有弱引用的对象。
- 作用:在垃圾回收过程中,垃圾回收器会检查弱引用表中的对象,如果这些对象没有其他强引用,就会被回收。弱引用表主要用于实现内存敏感的缓存和资源管理。
12. 如何使用 WeakHashMap
?
问题:如何使用 WeakHashMap
?
答案:
WeakHashMap
:是一个基于弱引用的哈希表,键是弱引用,值可以是任意引用类型。- 使用场景:适用于实现内存敏感的缓存,当键对象被垃圾回收时,对应的条目也会被移除。
- 示例代码:
import java.util.WeakHashMap;public class WeakHashMapExample {public static void main(String[] args) {WeakHashMap<String, String> map = new WeakHashMap<>();String key = new String("key");map.put(key, "value");System.out.println(map.get(key)); // 输出 "value"key = null;System.gc(); // 请求垃圾回收// 垃圾回收后,键对象被回收,对应的条目也被移除System.out.println(map.get("key")); // 输出 null} }
13. 什么是引用队列?如何使用?
问题:什么是引用队列?如何使用?
答案:
- 引用队列:
ReferenceQueue
是一个队列,用于接收被垃圾回收器回收的引用对象。 - 使用场景:通常与
PhantomReference
一起使用,用于在对象被垃圾回收时收到通知。 - 示例代码:
import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue;public class PhantomReferenceExample {public static void main(String[] args) {Object obj = new Object();ReferenceQueue<Object> queue = new ReferenceQueue<>();PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);obj = null;System.gc(); // 请求垃圾回收// 检查引用队列PhantomReference<?> ref = (PhantomReference<?>) queue.poll();if (ref != null) {System.out.println("对象已被垃圾回收");}} }
14. 什么是引用逃逸?如何避免?
问题:什么是引用逃逸?如何避免?
答案:
- 引用逃逸:在对象构造过程中,对象的引用被外部访问,导致对象在未完全构造完成的情况下被使用。
- 避免方法:
- 私有化构造函数:将构造函数设为私有,通过工厂方法创建对象。
- 避免在构造函数中传递引用:不要在构造函数中将对象的引用传递给外部方法。
- 使用
final
修饰符:将对象的属性设为final
,确保对象的不可变性。
15. 什么是引用透明性?Java中的引用是否透明?
问题:什么是引用透明性?Java中的引用是否透明?
答案:
- 引用透明性:在一个表达式中,如果可以用一个值替换另一个值而不改变程序的行为,那么这个表达式就是引用透明的。
- Java中的引用:Java中的引用不是完全透明的,因为引用的赋值和传递可能会改变对象的状态。但是,对于不可变对象(如
String
),引用是透明的。
相关文章:
java引用相关(四大引用类型,软引用避免oom,弱引用表,虚引用和引用队列,可达性分析算法)
1. 什么是引用? 问题:什么是引用?Java中的引用是如何工作的? 答案: 引用 是对象的句柄,用于访问堆内存中的对象。在Java中,引用变量实际上存储的是对象的地址,而不是对象本身。通…...
图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。
图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。 目录 图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基…...
2、开发环境优化与创建第一个插件程序
一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…...
Android CoordinatorLayout:打造高效交互界面的利器
目录 一、CoordinatorLayout 介绍及特点 二、使用方法 2.1 创建 CoordinatorLayout 布局 2.2 添加需要协调的子视图 2.3 自定义 Behavior 三、结语 相关推荐 在Android开发中,面对复杂多变的用户界面需求,CoordinatorLayout以其强大的交互管理能力…...
计算机视觉:学习指南
一、引言 计算机视觉作为人工智能领域的一个重要分支,致力于让计算机理解和解释视觉信息,近年来取得了令人瞩目的进展,广泛应用于安防监控、自动驾驶、图像编辑、医学影像分析等众多领域。从入门到精通计算机视觉需要系统地学习一系列知识和…...
创建型设计模式
一、设计模式介绍 1.设计模式是什么 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案; 2.设计模式怎么来的? 满足设计原则后,慢慢迭代出来的。 3.设…...
【Ubuntu】使用ip link工具创建虚拟局域网并配置?
🦋🦋🦋如何使用ip link工具创建虚拟局域网? sudo ip link add link enx888bd66b7000 name enx.120 type vlan id 120 上述命令使用ip link工具在Linux系统中创建了一个新的虚拟局域网(VLAN)接口,…...
川渝地区软件工程考研择校分析
通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西南交通大学软件工程学硕。该校24届软件工程学硕实际录取1…...
云原生基础设施指南:精通 Kubernetes 核心与高级用法
1. 云原生的诞生 随着互联网规模的不断增长,以及企业对敏捷开发、快速交付和高可用性的需求日益增强,传统的单体架构逐渐暴露出局限性,难以满足现代业务对动态扩展和高效迭代的要求。为此,云原生应运而生。 云原生是为云计算时代…...
Pyinstaller使用指南以及遇到的问题
一、在cmd命令行执行安装pyinstaller工具 pip install pyinstaller 二、在命令行中执行打包命令即可 格式如下: pyinstaller [opts] yourprogram.py 参数含义 -F 指定打包后只生成一个exe格式的文件(建议写上这个参数) -D –onedir 创建一个目录,包含…...
美图撕掉蔡文胜标签
卖掉比特币的美图不投机了。 作者|周立青 编辑|杨舟 12月5日,比特币突破10万美元大关,曾花费1亿美元购入虚拟货币的美图宣布已出售所有加密货币。 美图在港交所发布公告称,自2024年11月起,公司已开始出售其持有的加密货币&…...
【Spring】IoC和DI,控制反转,Bean对象的获取方式
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:什么是IoC 1:什么是容器 2:什么是IoC 二:IoC应用…...
【015】对文件进行压缩_#py
对文件进行压缩 1. 下载7z软件2. 调用exe文件3. 压缩和分卷压缩4. 完整代码 1. 下载7z软件 从官网下载https://www.7-zip.org/软件。 2. 调用exe文件 主要是通过 subprocess 调用对应的command的命令。 subprocess.run(command, checkTrue)其中 command 的应包含7z软件的ex…...
OD C卷【智能成绩表】
题目 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名。 输入描述: 第一行输入学生人数n、科目数量m; 0<n<100; 0<m<10 第二行输入m个科目名称,以空格分开;科目只由英文字母构成,长度不超过…...
开源架构与云计算的传奇融合
开源架构与云计算的传奇融合 一、引言二、开源架构与云计算的卓越优势(一)成本效益惊世骇俗(二)灵活性与可扩展性无与伦比(三)社区支持与创新活力爆棚 三、震撼应用案例剖析(一)容器…...
【SpringBoot-事件监听】
文章目录 1. 定义事件2. 创建监听器3. 发布事件注意事项 在Spring Boot中,事件监听是一种常用的机制,用于在应用程序的不同部分之间进行松耦合的通信。Spring Boot基于Spring框架,因此它继承了Spring的事件发布和监听机制。以下是如何在Sprin…...
【docker】springboot 服务提交至docker
准备docker (不是docker hub或者harbor,就是可以运行docker run的服务),首先确保docker已经安装。 本文以linux下举例说明: systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…...
Facebook广告突然无消耗?原因解析与解决方案。
在Facebook广告投放中,广告突然无消耗是很多广告主都会遇到的难题。这种情况不仅浪费时间,还可能导致营销活动停滞,影响业务发展。那么,广告无消耗的原因是什么?又该如何解决呢? 一、Facebook广告无消耗的…...
05 在 Linux 使用 AXI DMA
DMA简介 DMA 是一种采用硬件实现存储器与存储器之间或存储器与外设之间直接进行高速数据传输的技术,传输过程无需 CPU 参与(但是CPU需要提前配置传输规则),可以大大减轻 CPU 的负担。 DMA 存储传输的过程如下: CPU 向…...
android AIDL ipc binder转换
一. 概述 众所周知AIDL并不是所有的数据类型都可以传输。 可以传输的类型包括: 1.原生类型 2.String 3. CharSequence 4. List 5.Map 6. Binder 7. Parcelable 容器类 parcelable传输的时候会分解成成员,数组item的方式,传输完成后再进行…...
【docker】12. Docker Volume(存储卷)
什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。 在宿主机上…...
1. 机器学习基本知识(4)——机器学习测试和验证
1.6 测试和验证 了解模型对新实例的泛化能力的唯一方法是在新实例上进行实际尝试。 一种方法是将模型部署到生产环境并监控其性能。 这种方法很有效,但如果模型非常糟糕,你的用户就会抱怨,所以这显然不是最好的方法。 更好的选择是将数…...
生成式AI概览与详解
1. 生成式AI概览:什么是大模型,大模型应用场景(文生文,多模态) 生成式AI(Generative AI)是指通过机器学习模型生成新的数据或内容的人工智能技术。生成式AI可以生成文本、图像、音频、视频等多种…...
软件项目标书参考,合同拟制,开发合同制定,开发协议,标书整体技术方案,实施方案,通用套用方案,业务流程,技术架构,数据库架构全资料下载(原件)
1、终止合同协议书 2、项目合作协议 3、合同交底纪要 4、合同管理台账 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单&…...
C++ extern “C“ 用法
extern “C” 由于c中需要支持函数重载,所以c和c中对同一个函数经过编译后生成的函数名是不相同的 extern “C” 的主要作用就是为了实现c代码能够调用其他 c 语言代码。 1(不常用) //告诉编译器 show() 函数按c语言的方式进行编译和链接 extern "C" voi…...
Node.js(v16.13.2版本)安装及环境配置教程
一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本,这里我选择的是Windows系统、64位(v16.13.2版本) 下载后的zip文件 二、解压文件到nodejs,并打开文件夹nodejs,复制解压…...
父组件调用子组件的方法
父组件 在父组件中调用子组件的sayHello()函数 <template><div><button click"getChild(wendu)">触发子组件方法wendu</button><button click"getChild(shidu)">触发子组件方法shidu</button><el-dialog v-model…...
运维排错系列:Excel上传失败,在剪切板有大量信息。是否保存其内容...
问题点 在导入 Excel 数据到 SAP 的时候,某些时刻系统会出现如下的弹窗。 上载 excel 文件时,您会收到错误:“剪贴板上有大量信息。XXX” Microsoft Office Excel 的弹出窗口显示以下信息: 剪贴板上存在大量信息。是否保留其内容…...
【自学】Vues基础
学习目录 Vues基础本地应用网络应用综合应用 工具的准备 我个人比较喜欢使用HTMLDROWNER,学习资料推荐使用VC,仅供选择吧 前置知识 HTMLCSSJSAJAX:这个是学习资料博主推荐的 个人感觉认真学好HTMLCSSJS理解vues基础很容易上手 官方网址…...
ubuntu 7z解压rar文件报错:unsupported method message
问题说明 最近项目需要支持线上上传rar格式,7z来解压缩入库。开发测试过程中发现使用以下命令解压报错, 7z x FileImportTest01.rar -p"123456" -o/home/download -y文件目录内容已列出,但无法解压文件!!! 仔细检查命令没有问题…...
C语言基础六:循环结构及面试上机题
Day06:循环结构 定义 代码的重复执行,就叫做循环 循环的分类 无限循环:其实就是死循环,程序设计中尽量避免无限循环。程序中的无限循环必须可控。有限循环:循环限定循环次数或者循环的条件。 循环的构成 循环条件循环体 当型循环的实现…...
【蓝桥杯每日一题】技能升级
技能升级 2024-12-10 蓝桥杯每日一题 技能升级 二分 题目大意 一个角色有 N 种可以增加攻击力的技能,对于第 i 个技能首次升级可以提升 A i A_i Ai 点攻击力,随后的每次升级增加的攻击力都会减少 B i B_i Bi 。升级 ⌈ A i B i ⌉ \lceil \frac{A…...
C++作业4
1、思维导图 2、Person和Stu的拷贝构造和拷贝赋值函数 #include <iostream> using namespace std; class Person {string name;int *age; public:Person():age(new int(23)){cout << "Person的无参构造" << endl;}//初始化列表 :成员属性1(值),成…...
密码学——密码学基础、散列函数与数字签名
1.密码学概述 是信息安全的基础和核心,是防范各种安全威胁的重要手段,信息安全的许多相关知识都与密码学相关。 密码学发展 密码学是一门古老而又年轻的学科 ,几千年以前就存在,至今仍在发展演进。地位非常重要甚至起决定性作用…...
鹦鹉的饮食偏好:探索多彩的食物世界
鹦鹉,作为聪明且迷人的鸟类,其饮食习性一直是鸟类爱好者关注的焦点。了解鹦鹉喜欢吃什么食物,对于确保它们的健康与幸福至关重要。 鹦鹉的食物种类丰富多样,首先是各类种子与谷物。例如,葵花籽富含脂肪和蛋白质&#…...
AtCoder Beginner Contest 383
C - Humidifier 3 Description 一个 h w h \times w hw 的网格,每个格子可能是墙、空地或者城堡。 一个格子是好的,当且仅当从至少一个城堡出发,走不超过 d d d 步能到达。(只能上下左右走,不能穿墙)&…...
HALCON算子函数 Filter(过滤)(1)
Arithmetic图像算数处理 abs_diff_image:计算两个图像的绝对差别;abs_image:计算一个图像的绝对值(模数);add_image:使两个图像相加;div_image:使两个图像相除ÿ…...
哈希知识详解
目录 一、哈希 二、哈希函数 1、直接定值法 2、除留余数法 三、哈希冲突 四、哈希冲突解决 1、闭散列(开放定值法) 闭散列代码 2、哈希桶 哈希桶的结构 查找方法 插入方法 删除方法 析构 迭代器 完整哈希桶代码 五、通过哈希桶封装 unordered_map 和 unordered_set 一、…...
分库分表基本概念讲解
一、基本概念 产生背景 在数据爆炸的年代,单表数据达到千万级别,甚至过亿的量,都是很常见的情景。这时候再对数据库进行操作就是非常吃力的事情了,select个半天都出不来数据,这时候业务已经难以维系。不得已…...
【DRAM存储器四十二】LPDDR5介绍--LPDDR5的bank架构还能配,为什么8B模式只支持BL32?
👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《某LPDDR5数据手册》 、《JESD209-5C》 目录 BG mode 16B mode 8B mode...
ubuntu 新建脚本shell并增加图标 双击应用实现python运行
1.使用nano创建shell脚本文件 需要在终端窗口中输入“nano”以打开文本编辑器。 nano 在创建脚本文件前,我们要了解脚本文件是如何运行的: 直接运行:直接在终端直接输入需要运行的脚本文件名称,系统或用缺省版本的shell运行脚…...
【0x0006】HCI_Disconnect命令详解
目录 一、命令概述 二、命令格式和参数说明 2.1. HCI_Disconnect 命令格式 2.2. Connection_Handle 2.3. Reason 三、返回事件说明 3.1. HCI_Command_Status 事件 3.2. HCI_Disconnection_Complete事件 3.3. HCI_LE_CIS_Established事件(针对CIS) 四、事件执行流程…...
【C语言练习(5)—回文数判断】
C语言练习(5) 文章目录 C语言练习(5)前言问题问题解析结果总结 前言 通过回文数练习,巩固数字取余和取商如何写代码 问题 输入一个五位数判断是否为回文数? 问题解析 回文数是指正读反读都一样的整数。…...
【全连接神经网络】核心步骤及其缺陷
前向传播 计算公式(其中一种) x1/x2:输入值,一般是神经网络上一层的输出或者输入数据本身,上图中表示两个节点w11 w13:权重,在神经网络中,权重是学习的参数,表示每个输入…...
【Vulkan入门】11-CreateCommandBuffer
[TOC]目录 先叨叨 先叠个甲,我个人都觉得本篇有点灌水的嫌疑。 到上篇为止,已经创建好了Pipeline。接下来就是要给Pipeline发指令进行渲染了。 从一开始就不断强调,发给Vulkan的指令要通过Queue发送给Device。命令不是一条一条推到Queue中的…...
Redis原理—4.核心原理摘要
大纲(9870字) 1.Redis服务器的Socket网络连接建立 2.Redis多路复用监听与文件事件模型 3.基于队列串行化的文件事件处理机制 4.完整的Redis Server网络通信流程 5.Redis串行化单线程模型为什么能高并发 6.Redis内核级请求处理流程与原理 7.Redis通信协议与内核级请求数据…...
面向对象系统的分析和设计
来源:《设计模式精解-GOF23种设计模式解析》 作者:k_eckel k_eckels mindview - 博客园 (cnblogs.com) --------- 面向对象系统的分析和设计实际上追求的就是两点: (1)高内聚 (2)低耦合 …...
单片机:实现交通信号灯(附带源码)
使用单片机实现交通信号灯控制系统是一个经典的嵌入式系统应用。这个项目可以帮助你理解如何通过单片机控制不同颜色的LED灯、处理时间控制、以及输入输出的基本操作。通过这个项目,你将掌握如何设计交通信号灯的时序控制、如何实现定时控制交通灯的切换、以及如何与…...
小白如何学习看懂CAD图纸?
首先,你需要了解CAD图纸的基本构成,包括图例、尺寸标注、比例等等。接着,你可以通过一些专业的书籍、在线课程或视频教程来逐步学习如何识别和理解这些元素。但建议不要学的太复杂了。 掌握基本概念: 坐标系:了解CAD…...
HarmonyOS-高级(一)
文章目录 一次开发、多端部署自由流转 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日12点19分 一次开发、多端部署 布局能力 自适应布局 拉伸能力均分能力占比能力缩放…...