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

在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.mfbz.cn/a/782109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【实践分享】深度学习远程连接GPU

目录 前言 一、创建实例 二、上传文件 三、服务器上传 四、运行代码文件 前言 1、使用平台&#xff1a;恒源云 2、教程总结自B站大佬Larry同学发布的教程视频 一、创建实例 通俗&#xff1a;租用一台临时的电脑&#xff0c;电脑可自选GPU型号等&#xff0c;按照项目需…

品质至上!中国星坤连接器的发展之道!

在电子连接技术领域&#xff0c;中国星坤以其卓越的创新能力和对品质的不懈追求&#xff0c;赢得了业界的广泛认可。凭借在高精度连接器设计和制造上的领先地位&#xff0c;星坤不仅获得了多项实用新型专利&#xff0c;更通过一系列国际质量管理体系认证&#xff0c;彰显了其产…

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

论文&#xff1a;arxiv.org/pdf/2312.00858 代码&#xff1a;horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介绍 DeepCache是一种新颖的无训练且几乎无损的范式&#xff0c;从模型架构的角度加速了扩散模型。DeepCache利…

树(相关知识点)

目录 结点的度&#xff1a;某一个结点所含有字数的个数 叶节点&#xff1a;最后一个结点 非终端节点:不是叶结点 兄弟结点&#xff1a;亲兄弟结点 树的度&#xff1a;最大节点的度 层次&#xff1a;根为第一层&#xff0c;根的子结点为第二层&#xff0c;以此类推 森林&am…

[附源码]基于Flask的演唱会购票系统

摘要 随着互联网技术的普及和发展&#xff0c;传统购票方式因其效率低下、流程繁琐等问题已难以满足现代社会的需求。本文设计并实现了一个基于Flask框架的演唱会购票系统&#xff0c;该系统集成了用户管理、演唱会信息管理、票务管理以及数据统计与分析等功能模块&#xff0c…

linux centos7.9 安装mysql5.7;root设置客户端登录、配置并发、表名大小写敏感等

查看centos版本 cat /etc/centos-releasecentos版本为7.9 查看是否已安装mariadb,安装了需要先删除 1.查看是否安装了mariadb和mysql&#xff0c;安装了需要先删除 mariadb是mysql的一个分支&#xff0c;但要安装mysql需要删除它 执行rpm -qa|grep mariadb,查看mariadb情况…

Hi6602 恒压恒流SSR电源方案

Hi6602是一款针对离线式反激电源设计的高性能PWM控制器。Hi6602内集成有通用的原边恒流控制技术&#xff0c;可支持断续模式和连续模式工作&#xff0c;适用于恒流输出的隔离型电源应用中。Hi6602内部具有高精度65kHz开关频率振荡器&#xff0c;且带有抖频功能可优化EMI性能。H…

AI大模型技术分析

一文读懂&#xff1a;AI大模型&#xff01; 引言 近年来&#xff0c;随着深度学习技术的迅猛发展&#xff0c;AI大模型已经成为人工智能领域的重要研究方向和热点话题。AI大模型&#xff0c;指的是拥有巨大参数规模和强大学习能力的神经网络模型&#xff0c;如BERT、GPT等&…

java IO流(1)

一. 文件类 java中提供了一个File类来表示一个文件或目录(文件夹),并提供了一些方法可以操作该文件 1. 文件类的常用方法 File(String pathname)构造方法,里面传一个路径名,用来表示一个文件boolean canRead()判断文件是否是可读文件boolean canWrite()判断文件是否是可写文…

spring boot读取yml配置注意点记录

问题1&#xff1a;yml中配置的值加载到代码后值变了。 现场yml配置如下&#xff1a; type-maps:infos:data_register: 0ns_xzdy: 010000ns_zldy: 020000ns_yl: 030000ns_jzjz: 040000ns_ggglyggfwjz: 050000ns_syffyjz: 060000ns_gyjz: 070000ns_ccywljz: 080000ns_qtjz: 090…

【论文通读】RuleR: Improving LLM Controllability by Rule-based Data Recycling

RuleR: Improving LLM Controllability by Rule-based Data Recycling 前言AbstractMotivationSolutionMethodExperimentsConclusion 前言 一篇关于提升LLMs输出可控性的短文&#xff0c;对SFT数据以规则的方式进行增强&#xff0c;从而提升SFT数据的质量&#xff0c;进而间接帮…

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

数学系C++ 排序算法简述(八)

目录 排序 选择排序 O(n2) 不稳定&#xff1a;48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化&#xff1a; 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

一.2.(4)放大电路静态工作点的稳定;(未完待续)

1.Rb对Q点及Au的影响 输入特性曲线&#xff1a;Rb减少&#xff0c;IBQ&#xff0c;UBEQ增大 输出特性曲线&#xff1a;ICQ增大&#xff0c;UCEQ减少 AUUO/Ui分子减少&#xff0c;分母增大&#xff0c;但由于分子带负号&#xff0c;所以|Au|减少 2.Rc对Q点及Au的影响 输入特性曲…

【密码学】什么是密码?什么是密码学?

一、密码的定义 根据《中华人民共和国密码法》对密码的定义如下&#xff1a; 密码是指采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务。 二、密码学的定义 密码学是研究编制密码和破译密码的技术科学。由定义可以知道密码学分为两个主要分支&#x…

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3],…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

嵌入式开发SPI基本介绍与应用

目录 #SPI通信协议 #SPI基础概念 #SPI通信模式 #SPI通信时序类型 前言&#xff1a;本篇笔记参考嘉立创的开发文档&#xff0c;连接放在最后。 #SPI通信协议 #SPI基础概念 Serial Peripheral Interface 缩写SPI 翻译&#xff1a;串行外设接口 同步串行通信协议&…

FMEA在大型光伏电站安全生产管理中的应用

一、FMEA概述 FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;即失效模式和影响分析&#xff0c;是一种用于识别和分析产品或过程中潜在故障模式及其影响的方法。它通过对产品或过程中可能出现的故障模式进行系统性地梳理和分析&#xff0c;评估其可能的影响…

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…