Java 中的强引用、软引用、弱引用和虚引用分别是什么?
Java 中的引用类型:强引用、软引用、弱引用和虚引用
Java 中的引用类型主要分为 强引用、软引用、弱引用 和 虚引用,它们对对象的生命周期和垃圾回收(GC)行为产生不同的影响。
1. 强引用(Strong Reference)
定义
强引用是 Java 中最常见的引用类型。通过赋值操作符 = 创建的普通引用即为强引用。
特点
- 只要强引用存在,垃圾回收器(GC)就不会回收引用指向的对象。
- 强引用对象通常存储在堆内存中。
示例
public class StrongReferenceExample {
public static void main(String[] args) {
Object obj = new Object(); // 强引用
System.out.println(obj); // 强引用存在,obj 不会被回收
}
}
2. 软引用(Soft Reference)
定义
软引用是一种相对较弱的引用类型,可通过 java.lang.ref.SoftReference 类实现。
特点
- 软引用指向的对象在内存不足时才会被 GC 回收(适合实现缓存)。
- 软引用可以延长一些大对象的生命周期,直到 JVM 内存不足。
示例
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj);
obj = null; // 去掉强引用
System.out.println(softRef.get()); // 软引用仍然可用
// 在内存不足时,softRef 可能会被回收
}
}
注意
- 软引用常用于实现内存敏感的缓存机制。
3. 弱引用(Weak Reference)
定义
弱引用是一种比软引用更弱的引用类型,可通过 java.lang.ref.WeakReference 类实现。
特点
- 只要 GC 发现弱引用对象没有强引用或软引用关联时,立即回收。
- 通常用于实现规范化映射(如
WeakHashMap)。
示例
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 去掉强引用
System.out.println(weakRef.get()); // 弱引用仍然可用
System.gc(); // 显式调用 GC
System.out.println(weakRef.get()); // 弱引用可能被回收,返回 null
}
}
注意
- 弱引用非常适合使用在缓存或动态代理中。
4. 虚引用(Phantom Reference)
定义
虚引用是一种最弱的引用类型,可通过 java.lang.ref.PhantomReference 类实现。
特点
- 虚引用不会决定对象的生命周期。
- 主要用于跟踪对象被回收的时间点。
- 虚引用必须与引用队列(
ReferenceQueue)一起使用。
示例
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(); // 显式调用 GC
// 虚引用本身无法通过 get() 方法获取对象
System.out.println(phantomRef.get()); // 始终返回 null
}
}
注意
- 虚引用常用于清理工作或监控对象的回收状态。
5. 引用类型的对比
| 引用类型 | 描述 | 对 GC 的影响 | 适用场景 |
|---|---|---|---|
| 强引用 | 默认的引用类型,对象存活取决于引用 | GC 永远不会回收 | 常规对象引用 |
| 软引用 | 内存不足时回收 | 内存不足时 GC 可能回收 | 缓存实现 |
| 弱引用 | 只要 GC 发现,立即回收 | 只要无强引用或软引用时,立即回收 | WeakHashMap、动态代理等 |
| 虚引用 | 无法直接访问对象,仅用于回收跟踪 | GC 回收后加入 ReferenceQueue | 清理资源、监控对象回收状态 |
6. 总结
- 强引用:最常见的引用类型,保证对象不被回收。
- 软引用:内存敏感的引用,适合缓存场景。
- 弱引用:短生命周期的引用,适合规范化映射或动态代理。
- 虚引用:仅用于监控对象的回收,适合清理或跟踪任务。
Java 中的强引用、软引用、弱引用和虚引用分别是什么?的更多相关文章
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
//转 http://blog.csdn.net/lyfi01/article/details/6415726 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变 ...
- Java对象的强、软、弱和虚引用+ReferenceQueue
Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足 ...
- Java对象的强、软、弱和虚引用
本文介绍Java对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象 ...
- GC真正的垃圾:强、软、弱、和虚 对象
垃圾回收的基本思想就是判断一个对象是否可触及性,说白了就是判断一个对象是否可以访问,如果对象对引用了,说明对象正在被使用,如果发现对象没有被引用,说明对象已经不再使用了,不再使用的对象可以被回收,但是 ...
- Java:对象的强、软、弱、虚引用
转自: http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...
- Java:对象的强、软、弱和虚引用
1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...
- Java对象的强、软、弱和虚引用详解
1.对象的强.软.弱和虚引用 转自:http://zhangjunhd.blog.51cto.com/113473/53092/ 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...
- Java:对象的强、软、弱和虚引用[转]
原文链接:http://zhangjunhd.blog.51cto.com/113473/53092/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...
- Java:对象的强、软、弱和虚引用的区别
1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
随机推荐
- 看图识WAF
看图识WAF 宝塔 腾讯云T-Sec 阿里云盾 创宇盾
- python 爬取博客访问量
一.代码 """ Version: Python3.5 Author: OniOn Site: http://www.cnblogs.com/TM0831/ Time: ...
- Luogu P2824 排序 题解 [ 紫 ] [ 线段树 ] [ 二分 ] [ adhoc ]
排序:二分线段树神仙好题. trick 我们可以二分值域,然后把大于等于它的数标记成 \(1\),其他标记为 \(0\)(有些题需要标记成 \(-1\) ),然后根据这个来 check 方案是否可行, ...
- AI-接入
前言 前面已经申请了模型,并且通过测试已经可以访问使用了,本篇的接入还是使用Ollama,前面我们已经可以在命令行终端能够进行交互了,现在将AI接入到代码中: 准备 作为一名Neter这里使用的是.n ...
- windows的恶意代码自定义
代码执行步骤: 1,新建"文本文档" 2,输入代码 3,@echo off format C: /q/u/y 4,保存"文本文档" 文本文档.txt改为.bat ...
- 安川机器人HW1171766-A本体线缆维修详解
随着工业自动化程度的不断提高,安川机器人在生产线上的应用越来越广泛.然而,在长期运行过程中,安川机器人本体线缆可能会出现磨损.老化.断裂问题,这些问题不仅会影响机器人的正常运行,还可能导致生产线的停滞 ...
- openlayers 在地图上绘制矩形框,非鼠标框选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title d ...
- 【论文随笔】推荐系统综述_推荐模型、推荐技术与应用领域(A Survey of Recommendation Systems_ Recommendation Models, Techniques, and Application Fields)
前言 今天读的论文为一篇于2022年1月3日发表的论文,这篇文章是关于推荐系统的综述,主要研究了推荐系统在不同服务领域的应用趋势,包括推荐模型.技术和应用领域.通过分析2010年至2021年间发表的顶 ...
- DeepSeek 官方推出的提示词库,AI内容生成的精准导航仪!
前言 在当今数字化时代,人工智能(AI)正以前所未有的速度改变着我们的生活方式和工作模式.从简单的数据处理到复杂的创意生成,AI技术正逐渐渗透到各个领域,成为推动社会进步的重要力量.然而,如何高效地利 ...
- helm部署redis集群
Redis 集群部署流程 前提:K8s+helm安装完成 1. 安装 NFS 服务器 1.1 安装 NFS 工具包 在 NFS 服务器上安装 nfs-utils 包: sudo yum install ...