JVM 中的四类引用:强、软、弱、虚

导言
在 Java 开发中,垃圾收集(GC)机制通过自动管理内存提升了开发效率。但你是否知道 JVM 通过四种引用类型(强、软、弱、虚)精细控制对象生命周期?

强引用(Strong Reference)

特征:默认引用类型,只要强引用存在,对象绝不会被 GC 回收。

public class StrongReferenceDemo {public static void main(String[] args) {Object obj = new Object(); // 强引用System.out.println("GC前: " + obj);obj = null; // 切断强引用System.gc(); // 建议JVM执行GCSystem.out.println("GC后: " + obj);}
}

输出

GC前: java.lang.Object@15db9742
GC后: null

解析:将 obj 置为 null 后,原对象失去强引用,GC 会回收其内存。

软引用(SoftReference) 

特征:内存不足时,GC 会回收软引用对象。适合实现缓存。

public class SoftReferenceDemo {public static void main(String[] args) {SoftReference<byte[]> softRef = new SoftReference<>(new byte[10 * 1024 * 1024]); // 10MBSystem.out.println("GC前: " + softRef.get());System.gc();System.out.println("内存充足GC后: " + softRef.get());// 分配更多内存,触发内存不足byte[] newAllocation = new byte[15 * 1024 * 1024]; System.out.println("内存不足时: " + softRef.get());}
}

运行参数-Xmx20M 限制堆内存为 20MB

输出

GC前: [B@6d06d69c
内存充足GC后: [B@6d06d69c 
内存不足时: null

弱引用(WeakReference)

特征:无论内存是否充足,GC 时立即回收。

public class WeakReferenceDemo {public static void main(String[] args) {WeakReference<Object> weakRef = new WeakReference<>(new Object());System.out.println("GC前: " + weakRef.get());System.gc();System.out.println("GC后: " + weakRef.get());}
}

输出

GC前: java.lang.Object@7852e922
GC后: null

虚引用(PhantomReference)

特征:无法通过虚引用访问对象,必须配合 ReferenceQueue 使用,用于追踪对象回收。

public class PhantomReferenceDemo {public static void main(String[] args) throws InterruptedException {ReferenceQueue<Object> queue = new ReferenceQueue<>();PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);System.out.println("PhantomRef.get(): " + phantomRef.get()); // 始终为nullSystem.gc();Thread.sleep(500);Reference<?> ref = queue.poll();if (ref != null) {System.out.println("对象已被回收,通过队列通知");}}
}

输出

PhantomRef.get(): null
对象已被回收,通过队列通知

应用场景:管理堆外内存(如 NIO 的 DirectBuffer),确保资源释放。

四类引用对比总结

引用类型回收时机常见用途
强引用永不回收(除非不可达)普通对象创建
软引用内存不足时内存敏感缓存
弱引用下次GC时缓存、WeakHashMap
虚引用对象回收后资源清理跟踪

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

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

相关文章

数据结构--八大排序算法

1. 直接插入排序 当插入第 i(i>1) 个元素时&#xff0c;前面的 array[0],array[1],…,array[i-1] 已经排好序&#xff0c;此用 array[i] 的排序码与 array[i-1],array[i-2],… 的排序码顺序进行比较&#xff0c;找到插入位置即将 array[i] 插入&#xff0c;原来位置上的元素…

【C/C++算法】从浅到深学习---双指针算法(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是新开篇章也是算法的第一篇章----双指针算法&#xff0c;双指针算法是算法中非常…

Python内置函数map(), list(), len(), iter(), hex(), hash()的详细解析,包括功能、语法、示例及注意事项

1. map(function, iterable, ...) 功能&#xff1a;对可迭代对象中的每个元素应用指定函数&#xff0c;返回一个迭代器。 参数&#xff1a; function&#xff1a;要执行的函数&#xff08;可以是lambda表达式&#xff09;。 iterable&#xff1a;一个或多个可迭代对象&#x…

Win本地安装Ollama+本地运行大模型+Cherrystudio使用

0. 前言 本文主要介绍 win 本地安装 Ollama &#xff0c;本地部署 Ollama 的 deepseek-r1:7b 大模型&#xff0c;使用具有界面画操作的工具 Cherrystudio进行操作。文章内容仅供参考。 1. Ollama简介 ‌ ‌Ollama 是一个开源的框架&#xff0c;旨在本地运行大型语言模型…

用户点击商品埋点的实现方案

在高并发、可扩展性和高可用性的前提下&#xff0c;实现用户点击商品的埋点&#xff0c;方案应包括 数据采集、数据传输、数据存储和数据分析 四个主要环节。下面是一个完整的埋点实现方案&#xff1a; 1. 方案架构 整体流程&#xff1a; 前端埋点&#xff1a;用户点击商品时…

【C++】AVLTree(AVL树)简单模拟

文章目录 1.AVL树的结点2.AVL树的插入3.AVL树的旋转3.1 新节点插入较高左子树的左侧---左左&#xff1a;右单旋3.2 新节点插入较高右子树的右侧---右右&#xff1a;左单旋3.3 新节点插入较高左子树的右侧---左右&#xff1a;先左单旋再右单旋3.4 新节点插入较高右子树的左侧---…

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…

【数据结构】(6) LinkedList 链表

一、什么是链表 1、链表与顺序表对比 不同点LinkedListArrayList物理存储上不连续连续随机访问效率O(N)O(1&#xff09;插入、删除效率O(1)O(N) 3、链表的分类 链表根据结构分类&#xff0c;可分为单向/双向、无头结点/有头节点、非循环/循环链表&#xff0c;这三组每组各取…

使用Pygame制作“俄罗斯方块”游戏

1. 前言 俄罗斯方块&#xff08;Tetris&#xff09; 是一款由方块下落、行消除等核心规则构成的经典益智游戏&#xff1a; 每次从屏幕顶部出现一个随机的方块&#xff08;由若干小方格组成&#xff09;&#xff0c;玩家可以左右移动或旋转该方块&#xff0c;让它合适地堆叠在…

(苍穹外卖)项目结构

苍穹外卖项目结构 后端工程基于 maven 进行项目构建&#xff0c;并且进行分模块开发。 1). 用 IDEA 打开初始工程&#xff0c;了解项目的整体结构&#xff1a; 对工程的每个模块作用说明&#xff1a; 序号名称说明1sky-take-outmaven父工程&#xff0c;统一管理依赖版本&…

【漫画机器学习】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…

websocket自动重连封装

websocket自动重连封装 前端代码封装 import { ref, onUnmounted } from vue;interface WebSocketOptions {url: string;protocols?: string | string[];reconnectTimeout?: number; }class WebSocketService {private ws: WebSocket | null null;private callbacks: { [k…

【华为OD-E卷 - 115 数组组成的最小数字 100分(python、java、c++、js、c)】

【华为OD-E卷 - 数组组成的最小数字 100分&#xff08;python、java、c、js、c&#xff09;】 题目 给定一个整型数组&#xff0c;请从该数组中选择3个元素组成最小数字并输出 &#xff08;如果数组长度小于3&#xff0c;则选择数组中所有元素来组成最小数字&#xff09; 输…

在Vue3 + Vite 项目中使用 Tailwind CSS 4.0

文章目录 首先是我的package.json根据官网步骤VS Code安装插件验证是否引入成功参考资料 首先是我的package.json {"name": "aplumweb","private": true,"version": "0.0.0","type": "module","s…

AURIX TC275学习笔记4 官方GTM例程 GTM_TOM_PWM_1

文章目录 概述其他例程 代码分析IfxGtm_enable()IfxGtm_Cmu_enableClocks&#xff08;&#xff09;IfxGtm_Tom_Pwm_initConfig&#xff08;&#xff09;IfxGtm_Tom_Pwm_init&#xff08;&#xff09;IfxGtm_Tom_Pwm_start&#xff08;&#xff09;fadeLED() 概述 目的&#xf…

ASP.NET Core中间件的概念及基本使用

什么是中间件 中间件是ASP.NET Core的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…

app专项测试(网络测试流程)

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是…

Vue el-input密码输入框 按住显示密码,松开显示*;阻止浏览器密码回填,自写密码输入框;校验输入非汉字内容;文本框聚焦到内容末尾;

输入框功能集合 <template><div style"padding: 10px"><!-- 密码输入框 --><el-input:type"inputType"v-model"password"placeholder"请输入密码"auto-complete"new-password"id"pwd"style…

【数据结构】_复杂度

目录 1. 算法效率 2. 时间复杂度 2.1 时间复杂度概念 2.2 准确的时间复杂度函数式 2.3 大O渐进表示法 2.4 时间复杂度的常见量级 2.5 时间复杂度示例 3. 空间复杂度 3.1 空间复杂度概念 3.2 空间复杂度示例 1. 算法效率 一般情况下&#xff0c;衡量一个算法的好坏是…

Day48_20250130【回校继续打卡】_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II

Day48_20250130_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II 20250130补完 739.每日温度 题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0…