java 中的引用

news/2025/3/16 17:55:52/

强引用(Strong Reference)

最常见的引用类型。通过正常的赋值创建的引用,只要有强引用指向一个对象,垃圾回收器就不会回收该对象。

java">Object obj = new Object(); // obj 是一个强引用

垃圾回收:强引用所指向的对象在任何情况下都不会被垃圾回收。只有当引用失效时,垃圾回收器才会考虑回收这个对象。
如果一个对象被强引用所引用,即使内存不足,JVM 也不会回收它。
强引用适用于对必须存在的对象进行引用,比如大多数普通对象的引用方式。

软引用(Soft Reference)

用于描述一些还有用但并非必需的对象,内存不足时会回收这些对象。软引用可以通过 SoftReference 类来实现。

java">SoftReference<Object> softRef = new SoftReference<>(new Object());

当 JVM 发现内存不足时,会回收软引用指向的对象,避免内存溢出(OOM)。
软引用常用于实现内存敏感的缓存。例如缓存中存储的数据在内存充足时保留,当内存不足时进行回收。
适用于缓存设计。当系统内存充足时,缓存数据不会被回收,但在内存不足时,缓存数据会被回收以避免 OOM。

弱引用(Weak Reference)

用于描述非必需对象,GC 扫描时一旦发现只有弱引用指向的对象就会回收。弱引用可以通过 WeakReference 类来实现。它用于描述非必须的对象。

java">WeakReference<Object> weakRef = new WeakReference<>(new Object());

无论内存是否充足,垃圾回收器在进行可达性分析时,只要发现对象只被弱引用所引用,便会立即回收该对象。
弱引用通常用于实现规范化映射(canonicalizing mappings),例如 WeakHashMap,用来处理缓存或对象池中的弱引用对象。
适用于那些希望对象在不被强引用时可以随时被回收的场景,比如弱引用缓存,避免对象长时间占用内存。

虚引用(Phantom Reference)

最弱的引用,不能通过虚引用获取对象实例,唯一的作用是能在对象被回收时收到系统通知。虚引用可以通过 PhantomReference 类来实现。

java">PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);

虚引用的存在主要用于跟踪对象的生命周期,它不能阻止对象被回收。与虚引用关联的对象在垃圾回收时被标记为可回收,回收之前会将虚引用对象加入到一个 ReferenceQueue 队列中。
虚引用与 ReferenceQueue 联合使用,主要用于在对象被回收时进行一些后续处理,比如资源释放。
虚引用适用于管理直接内存的回收、监控对象生命周期或执行对象销毁前的清理工作。例如,当使用 DirectByteBuffer 时,可以通过虚引用在对象被回收前执行内存释放操作。


http://www.ppmy.cn/news/1579619.html

相关文章

Java常见的几种内存溢出及解决方法

目录 一、内存溢出概述二、常见的内存溢出类型及解决方法1. Java Heap Space(堆内存不足)2. GC Overhead Limit Exceeded(GC回收效率低下)3. PermGen Space(永久代内存不足,Java 7及之前)4. Metaspace(元空间内存不足,Java 8及之后)5. Direct Buffer Memory(直接内存…

淘宝API vs 爬虫:合规获取实时商品数据的成本与效率对比

以下是淘宝 API 和爬虫在合规获取实时商品数据方面的成本与效率对比&#xff1a; 成本对比 淘宝 API 开发成本&#xff1a;需要申请开发者账号并获取 API 权限&#xff0c;部分敏感或高频访问的接口可能需要额外的审核或付费。开发过程中需要按照平台规定进行编程&#xff0c;相…

SQLite?低调不是小众...

前几天在一个群里看到一位同学说&#xff1a;“SQLite这么小众的数据库&#xff0c;到底是什么人在用啊&#xff1f;” 首先要说的是 SQLite 可不是小众的数据库&#xff0c;相反&#xff0c;SQLite 是世界上装机量最多的数据库&#xff0c;远超 MySQL&#xff0c;只不过比较低…

机器学习——正则化、欠拟合、过拟合、学习曲线

过拟合&#xff08;overfitting&#xff09;:模型只能拟合训练数据的状态。即过度训练。 避免过拟合的几种方法&#xff1a; ①增加全部训练数据的数量&#xff08;最为有效的方式&#xff09; ②使用简单的模型&#xff08;简单的模型学不够&#xff0c;复杂的模型学的太多&am…

DeepSeek linux服务器(CentOS)部署命令笔记

Linux&#xff08;CentOS&#xff09;FinalShellOllama远程访问&#xff0c;本地部署deepseek 自备CentOS服务器&#xff0c;并且已经使用FinalShell连接到服务器 一、准备工作 1.更新服务器 apt-get update-y 2.下载Ollama curl -fsSL https://ollama.com/install.sh | …

数字孪生像魔镜,映照出无限可能的未来

在当今科技飞速发展的时代&#xff0c;数字孪生作为一项极具潜力的前沿技术&#xff0c;正逐渐崭露头角&#xff0c;成为众多领域关注的焦点。它犹如一面神奇的魔镜&#xff0c;以数字化的方式精准映照出现实世界中的各种实体与系统&#xff0c;为我们开启了一扇通往无限可能未…

深入 Python 网络爬虫开发:从入门到实战

一、为什么需要爬虫&#xff1f; 在数据驱动的时代&#xff0c;网络爬虫是获取公开数据的重要工具。它可以帮助我们&#xff1a; 监控电商价格变化抓取学术文献构建数据分析样本自动化信息收集 二、基础环境搭建 1. 核心库安装 pip install requests beautifulsoup4 lxml …

什么是 slot-scope?怎么理解。

1. 什么是 slot-scope&#xff1f; slot-scope 是 Vue 2 中用于作用域插槽的语法。它的作用是让子组件可以把一些数据传递给父组件&#xff0c;父组件可以根据这些数据自定义渲染内容。 简单来说&#xff1a; 子组件&#xff1a;负责提供数据。 父组件&#xff1a;负责根据数…