Java引用的4种类型:强、软、弱、虚

news2025/1/8 6:31:01

在Java中,引用的概念不仅限于强引用,还包括软引用、弱引用和虚引用(也称为幻影引用)。这些引用类型主要用于不同的内存管理策略,尤其是在垃圾收集过程中。以下是对这四种引用类型的详细解释:

1. 强引用(Strong Reference)

这是Java中最常见的一种引用类型。任何通过赋值操作创建的普通对象引用都是强引用,就是我们最常见的普通对象引用。例如:

String str = new String("Hello, World!");
  • 不易被回收:只要还有强引用指向一个对象,就能表示对象还“活着”,垃圾收集器就不会回收被引用的对象。即使系统内存不足,JVM也不会回收这些对象,而宁愿抛
    OutOfMemoryError(OOM)。
  • 使用场景:大多数情况下使用强引用来引用对象。

2. 软引用(Soft Reference)

软引用是一种较强引用更弱的引用类型,主要用于实现内存敏感的高速缓存。

import java.lang.ref.SoftReference;

String str = new String("Hello, World!");
SoftReference<String> softRef = new SoftReference<>(str);
  • 回收条件:只有在内存不足时,垃圾收集器才会回收被软引用引用的对象。因此,软引用非常适合用来实现缓存。
  • 使用场景:适用于缓存设计,如图片缓存、数据缓存等。
  • 类:SoftReference 类。

3. 弱引用(Weak Reference)

弱引用比软引用更弱,它不会阻止垃圾收集器回收对象。

import java.lang.ref.WeakReference;

String str = new String("Hello, World!");
WeakReference<String> weakRef = new WeakReference<>(str);
  • 回收条件:当垃圾收集器运行时,无论内存是否充足,都会回收被弱引用引用的对象。
  • 使用场景:适用于一些不那么重要的对象,如映射中的键(WeakHashMap),以防止内存泄漏。
  • 类:WeakReference 类。

4. 虚引用(Phantom Reference)

虚引用是最弱的一种引用,主要用于跟踪对象被垃圾收集器回收的活动。虚引用必须和引用队列(ReferenceQueue)一起使用。

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

String str = new String("Hello, World!");
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phantomRef = new PhantomReference<>(str, queue);
  • 回收条件:虚引用本身并不影响对象的生命周期。当对象被垃圾收集器回收后,虚引用会被加入到与之关联的引用队列中。
  • 使用场景:主要用于检测对象被垃圾回收的时间,常用于清理资源等操作。
  • 类:PhantomReference 类。

总结
强引用(Strong Reference):最常见的引用类型,引用存在时对象不会被回收。
软引用(Soft Reference):适用于内存敏感的缓存,当内存不足时对象才会被回收。
弱引用(Weak Reference):适用于非重要对象,当垃圾收集器运行时对象就可能被回收。
虚引用(Phantom Reference):最弱的引用类型,用于跟踪对象被回收的活动,常与引用队列结合使用。
这些引用类型提供了不同级别的内存管理策略,帮助开发者更灵活地控制对象的生命周期和内存使用。

使用实例:
如果有一个强引用变量和一个弱引用变量同时指向堆中的同一个对象,当强引用变量被置为 null 后,若该对象没有其他强引用,那么仅靠弱引用是无法阻止该对象被垃圾收集器回收的。垃圾收集器在合适的时机会回收该对象,并将弱引用置为 null。因此,weakRef.get() 将返回 null,表示该对象已经被回收。

import java.lang.ref.WeakReference;

public class Main {
    public static void main(String[] args) {
        // 创建一个强引用
        String strongRef = new String("Hello, World!");
        
        // 创建一个弱引用,指向同一个对象
        WeakReference<String> weakRef = new WeakReference<>(strongRef);
        
        // 强引用置为null,表示不再使用该强引用
        strongRef = null;
        
        // 触发垃圾收集
        System.gc();
        
        // 检查弱引用是否还存在
        if (weakRef.get() != null) {
            System.out.println("对象尚未被回收");
        } else {
            System.out.println("对象已被回收");
        }
    }
}

结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GD32实战篇-双向数控BUCK-BOOST-BUCK降压理论基础

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

论文解析——FTRANS: Energy-Efficient Acceleration of Transformers using FPGA

作者及发刊详情 Li B , Pandey S , Fang H ,et al.FTRANS: energy-efficient acceleration of transformers using FPGA[J].ACM, 2020.DOI:10.1145/3370748.3406567. 摘要 正文 主要工作贡献 与CPU和GPU在执行Transformer和RoBERTa相比&#xff0c;提出的FTRANS框架获得了…

计算云服务2

第二章 裸金属服务器 什么是裸金属服务器(BMS) 裸金属服务器(Bare Metal Server&#xff0c;BMS)是一款兼具虚拟机弹性和物理机性能的计算类服务为用户以及相关企业提供专属的云上物理服务器&#xff0c;为核心数据库、关键应用系统、高性能计算、大数据等业务提供卓越的计算…

买的Google账号登录,修改辅助邮箱收不到验证码?可能是个简单的错误

这篇文章分享一个案例&#xff0c;购买了谷歌账号以后如何修改辅助邮箱&#xff0c;修改辅助邮箱的一些要点&#xff0c;以及常见的一个错误。 一、案例回放 这个朋友昨天在我的一个视频下面留言说买了谷歌账号以后&#xff0c;想修改辅助邮箱地址&#xff0c;但是输入了辅助…

µCOS-III 任务同步机制-任务信号量

1. 什么是任务信号量 任务信号量是一种用于任务间同步和通信的计数器&#xff0c;通常用于解决任务间的竞争条件和资源共享问题。在C/OS-III中&#xff0c;任务信号量提供了二进制信号量和计数信号量两种类型&#xff1a; 二进制信号量&#xff1a;只能取值0或1&#xff0c;适…

VSCode神仙插件——Codeium (AI编程助手)

1、安装&登录插件 安装过程中会让你登录Codeium账户&#xff0c;可以通过Google账户登录&#xff0c;或者可以注册一个Codeium账户&#xff08;如果没有弹出让你登录账户的界面&#xff0c;可以等安装结束后在右下角找到登录的地方&#xff09; 右下角显示如下图所示&#…

大模型面试题目

1.为什么需要做位置编码 位置编码&#xff08;Positional Encoding&#xff09;在变换器&#xff08;Transformer&#xff09;模型中非常重要&#xff0c;因为变换器架构本身没有内置的顺序信息。变换器使用的是自注意力机制&#xff0c;它能够捕捉输入序列中所有词之间的相关性…

opencv_C++学习笔记(入门30讲)

文章目录 1.配置开发环境2.图像读取与显示3.图像色彩空间转换4.图像对象的创建与赋值5.图像像素的读写操作6.图像像素的算数操作7.滚动条-调整图像亮度8.滚动条-调整对比度和亮度9.键盘响应操作10.图像像素的逻辑操作11.图像的通道分离和合并12.图像色彩空间转换13.图像的像素值…

vue3+antd 实现点击按钮弹出对话框

格式1&#xff1a;确认对话框 按钮&#xff1a; 点击按钮之后&#xff1a; 完整代码&#xff1a; <template><div><a-button click"showConfirm">Confirm</a-button></div> </template> <script setup> import {Mod…

QT滑块图片验证程序

使用QT实现滑块验证程序&#xff0c;原理是画个图片&#xff0c;然后在图片上画个空白区域&#xff0c;再画个滑块图片。 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widg…

python语法及写的工具代码总结

目录 python画图&处理图片python增大图片的大小&#xff08;比如将几百K的照片增加到几mb&#xff09;解决python画图无法显示中文的问题python画折线图 & 一张图上三条折线 & 设置折线marker & chatgpt画折线图的提示词python将png格式的图片转换为jpg格式的图…

Rockstar Games:铸造游戏传奇的不朽征程

在电子游戏的历史长廊中&#xff0c;Rockstar Games&#xff08;R星&#xff09;犹如一座巍峨的丰碑&#xff0c;以其无与伦比的创造力和深刻的社会影响力&#xff0c;成为了游戏界的传奇缔造者。自1998年诞生于纽约的喧嚣中&#xff0c;这家由Houser兄弟掌舵的游戏公司&#x…

每天一道面试题之浅浅讲一下java5中的自动装箱和自动拆箱

自动装箱自动拆箱 我们在java5中引入概念 把基本数据类型自动装箱成包装类 把包装类自动拆箱成基本数据类型 我们可以用javap查看字节码文件 首先我们要通过javac编译.java文件 获取字节码.class文件 然后用javap查看 源码 import java.util.ArrayList; import java.uti…

spRAG框架学习小结

spRAG是什么 spRAG是一个针对非结构化数据的检索引擎。它特别擅长处理对密集文本的复杂查询&#xff0c;比如财务报告、法律文件和学术论文。有两种关键方法用于提高性能&#xff0c;超越了普通的RAG系统&#xff1a; 自动上下文&#xff08;AutoContext&#xff09;&#xff…

C++语言相关的常见面试题目(三)

1. List底层实现原理 省流&#xff1a; list底层实现了一个双向循环链表。 每个元素&#xff08;或节点&#xff09;包含三个部分&#xff1a;数据域(_M_Storage)、前驱指针(_M_prev)、后继指针(_M_next)。 数据域&#xff1a;存储实际数据。 前驱指针&#xff1a;指向链表中…

一篇就够了,为你答疑解惑:锂电池一阶模型-在线参数辨识(附代码)

锂电池一阶模型-在线参数辨识 背景在线 VS 离线 参数辨识递推最小二乘法一阶戴维南Z域离散表达式 背景 锂电池一阶戴维南等效模型的基础知识和离线辨识方法&#xff0c;已经在上一期非常详细地讲解了一轮&#xff08;上期文章请戳此处&#xff09;&#xff0c;本期继续讲解一下…

美光科技在2024年1γ工艺技术在10纳米级别启动EUV试产

美光科技&#xff08;Micron&#xff09;在2024年针对其1γ&#xff08;1-gamma&#xff09;工艺技术在10纳米级别启动EUV&#xff08;极紫外光刻&#xff09;试产&#xff0c;这标志着存储行业巨头在EUV采用上的重要一步&#xff0c;尽管相比英特尔和台积电等其他半导体制造商…

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…

SpringBoot整合DataX数据同步(自动生成job文件)

SpringBoot整合Datax数据同步 文章目录 SpringBoot整合Datax数据同步1.简介设计理念 DataX3.0框架设计DataX3.0核心架构核心模块介绍DataX调度流程 2.DataX3.0插件体系3.数据同步1.编写job的json文件2.进入bin目录下&#xff0c;执行文件 4.SpringBoot整合DataX生成Job文件并执…

SAP_MM模块-特殊业务场景下的系统实现方案

一、业务背景 目前公司有一种电商业务&#xff0c;卖的是备品配件&#xff0c;是公司先跟供应商采购&#xff0c;然后再销售给客户&#xff0c;系统账就是按照正常业务来流转&#xff0c;公司进行采购订单入库&#xff0c;然后销售订单出库。 不过这种备品配件&#xff0c;实…