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 中的强引用、软引用、弱引用和虚引用分别是什么?的更多相关文章

  1. Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器

    //转 http://blog.csdn.net/lyfi01/article/details/6415726 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变 ...

  2. Java对象的强、软、弱和虚引用+ReferenceQueue

    Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足 ...

  3. Java对象的强、软、弱和虚引用

    本文介绍Java对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象 ...

  4. GC真正的垃圾:强、软、弱、和虚 对象

    垃圾回收的基本思想就是判断一个对象是否可触及性,说白了就是判断一个对象是否可以访问,如果对象对引用了,说明对象正在被使用,如果发现对象没有被引用,说明对象已经不再使用了,不再使用的对象可以被回收,但是 ...

  5. Java:对象的强、软、弱、虚引用

    转自: http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  6. Java:对象的强、软、弱和虚引用

    1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...

  7. Java对象的强、软、弱和虚引用详解

    1.对象的强.软.弱和虚引用 转自:http://zhangjunhd.blog.51cto.com/113473/53092/ 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  8. Java:对象的强、软、弱和虚引用[转]

    原文链接:http://zhangjunhd.blog.51cto.com/113473/53092/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  9. Java:对象的强、软、弱和虚引用的区别

    1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...

  10. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

随机推荐

  1. atomikos实现分布式事务

    date: 2022-04-25 categories: [java, 编程] tags: [分布式事务] 概述 多数据源单服务写入, 分布式事务实现 使用随机数控制产生异常 注: 网上很多都是只有多 ...

  2. 某次信创环境Oceanbase数据库偶发乱码问题

    资料迁移,整理分享. 问题发生在2023年 一.环境介绍及问题简述 数据库 oceanbase 操作系统 Linux (麒麟) WEB中间件 Tongweb 数据库表编码 GBK 中间件默认使用的HT ...

  3. el-table当前行的获取和设置,用于表格行操作

    1.在vue的data区声明当前行变量对象,如果当前行的信息用于了按钮的状态则需要赋予默认值,否则会报找不到属性的错误,比如下面会用到当前记录的status属性值控制按钮是否可用. //表格选中的行 ...

  4. Tesseract-OCR使用有感

    这玩意儿就只有一个Tesseract.dll 就算有其它的加上x64目录下的另外两个dll leptonica-1.80.0.dll  tesseract41.dll也不过几兆而已,但是 但是 但是 ...

  5. OpenStack基本介绍

    本文分享自天翼云开发者社区<OpenStack基本介绍>,作者:m****n 基本介绍 OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenSt ...

  6. JMeter中的JavaScript加密实战

    JMeter中的JavaScript加密实战 在性能测试领域,Apache JMeter 作为一款强大的开源工具,广泛应用于模拟多用户并发请求以评估应用程序的性能.然而,在实际的测试场景中,直接传输明 ...

  7. linux mint安装Idea

    一.前言 这一节我们介绍在Linux下如何安装与破解Intellij idea2017.现在有很多公司开发环境都是Linux,所以掌握在Linux环境下使用Idea办公也是咱们必须得掌握的技能. 记住 ...

  8. FLink09的RichFlatMap和RichMap使用

    一.数据源配置 pom文件:https://www.cnblogs.com/robots2/p/16048648.html 二.RichFlatMap代码,输入单行输出多行 package net.x ...

  9. ClickHouse 常用语句

    一.常用操作 1.建数据库 连接数据库:clickhouse-client -h 10.0.0.0 --port 9000 -u test_user --password test_password  ...

  10. 使用docker-compose 部署本地apollo

    注意: Mysql 需要自己安装本教程只提供apollo的安装和部署 拉取镜像 docker pull apolloconfig/apollo-portal docker pull apollocon ...