Java面试八股之强软弱虚引用的概念及区别

  1. Java中强软弱虚引用的概念及区别

在Java中,强引用、软引用、弱引用和虚引用是四种不同类型的引用,它们在对象生命周期管理、垃圾收集(Garbage Collection, GC)以及内存管理方面有着不同的行为和用途。以下是它们的概念和主要区别。

强引用(Strong Reference):

- 概念:强引用是最常见的引用类型,当我们通过new关键字创建一个对象并将其赋值给一个变量时,就创建了一个对该对象的强引用。只要强引用存在,GC就不会回收该对象,即使内存空间不足,JVM也会抛出OutOfMemoryError错误,也不会回收强引用指向的对象。

- 特点:只要强引用还在,对象必定不会被回收。强引用可能导致内存泄漏,因为即使对象不再需要,只要还有强引用指向它,GC就无法回收。

软引用(Soft Reference):

- 概念:软引用是一种相对强引用而言较弱的引用关系。当一个对象只有软引用存在时,系统内存空间充足时,该对象不会被回收;只有在内存不足且需要分配内存给新对象时,才会考虑回收软引用指向的对象。

- 特点:软引用主要用于实现内存敏感的缓存。当内存足够时,软引用的对象不会被回收,可以有效利用缓存提高性能;当内存紧张时,软引用的对象会被回收,释放内存,避免内存溢出。

弱引用(Weak Reference):

- 概念:弱引用比软引用更弱,即使内存空间足够,只要一个对象只有弱引用存在,那么在下一次垃圾收集时,该对象就会被回收。

- 特点:弱引用主要用于防止内存泄漏,但又不想在对象真正被使用时过早回收。例如,弱引用可以用于实现映射关系(如WeakHashMap),当某个键对象不再被其他强引用持有时,对应的键值对能够被自动清理,避免内存泄漏。

虚引用(Phantom Reference):

- 概念:虚引用是最弱的一种引用关系,它不能单独使用,必须与一个引用队列(ReferenceQueue)关联。一个对象是否有虚引用存在对其生存期没有影响,也无法通过虚引用来获取对象实例。虚引用的唯一目的是在对象被垃圾回收器回收时收到一个系统通知。

- 特点:虚引用主要用于跟踪对象被垃圾收集器回收的活动。当垃圾回收器准备回收一个对象,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过检查引用队列来了解对象是否已被回收,但不能通过虚引用来访问对象本身。

总结:

- 强引用确保对象在引用存在期间不会被回收,可能导致内存泄漏。

- 软引用在内存充足时不会回收对象,可用于实现内存敏感的缓存。

- 弱引用在下次GC时就会回收对象,用于防止内存泄漏且允许对象适时回收。

- 虚引用不决定对象的生命周期,仅在对象被回收时提供通知机制,常用于追踪对象回收情况。

这四种引用提供了不同的对象生命周期控制手段,可以根据实际需求选择合适的引用类型来管理对象的生命周期和内存占用。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

2.Neo4j的搭建启动

Graph Database 图数据库 版本对应关系 官网都是高版本,推荐使用下载地址可以找到社区老版本: https://we-yun.com/doc/neo4j/ neo4j.bat 启动脚本 cypher-shell.bat 执行CQL语句的。 import文件夹可以放入excel,csv等数据文件,导入到…

多模态大语言模型和 Apple 的 MM1

原文地址:multimodal-large-language-models-apples-mm1 2024 年 4 月 13 日 抽象是计算机科学中最关键的概念之一,具有一些最强大的影响。从简单的角度来看,抽象就是将某一事物应用于多种不同情况的能力。例如,如果你创造了一种…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型,如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

JAVA面试专题-微服务篇

Spring cloud Spring Cloud 5大组件有哪些 注册中心/配置中心:nacos 负载均衡:Ribbon 服务远程调用:Feign 服务保护:sentinel 服务网关:Gateway 微服务注册和发现 nacos和eureka的区别 负载均衡 微服务向Ribbon发送…

基于Spring Boot的校园疫情防控系统设计与实现

基于Spring Boot的校园疫情防控系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录首页界面图,管理员进入校园疫…

Android --- 消息机制与异步任务

在Android中,只有在UIThread(主线程)中才能直接更新界面, 在Android中,长时间的工作联网都需要在workThread(分线程)中执行 在分线程中获取服务器数据后,需要立即到主线程中去更新UI来显示数据, 所以,如…

手撕spring框架(2)

相关系列 java中spring底层核心原理解析(1)-CSDN博客 java中spring底层核心原理解析(2)-CSDN博客 手撕spring框架(1)-CSDN博客 手撕spring框架(3)-CSDN博客 手撕spring框架(4)-CSDN博…

用龙梦迷你电脑福珑2.0做web服务器

用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑,在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件,也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…

Qt Creator导入第三方so库和jar包——Qt For Android

前言 之前了解了在Android Studio下导入so库和jar包,现在实现如何在Qt上导入so库和jar包。 实现 下面是我安卓开发(需调用安卓接口的代码)的目录(图1),此目录结构和原生态环境(Android Studi…

详细分析Java中的脱敏注解(附Demo)

目录 前言1. 基本知识2. 核心逻辑3. Demo4. 模版 前言 对于隐私信息,需要做特殊处理,比如身份证或者手机号等 对于Java的相关知识推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) 1. 基本知…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构:分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变,软件架构也需要同步进行升级,引入面向服务的架构(Service-Oriented Architecture,简称 SOA)方法论。…

ThreeJS:响应式画布与全屏控制

响应式画布 响应式画布:在用户缩放浏览器窗口时,为便于动态更新画布尺寸与宽高比例,需要通过监听resize事件,来实现响应式画布。 window.onresize function () {//TODO:重置渲染器宽高比renderer.setSize(window.innerWidth, wi…

为人处事电影解说,全新升级瀚海跑道一分钟一条视频,全平台可推广,轻轻松松日入1000

自古以来,我国流行的一种现象是,大多数人都会与领导或上司打交道。由于某些话题不宜公开讨论,因此出现了许多含蓄的表达方式。随着年龄的增长,人们的态度也发生了变化,从最初的轻视到现在的重视。 下 载 地 址&#…

VG做mirror引起的块偏移

事件起因 Oracle10.2环境 Aix操作系统使用aix的lvm技术。制作vg的mirror。以此来替换掉老的存储。 做mirror前,数据库已完全关闭 故障现象 在启动数据库时,发现IO错误。该系统的spfile,ctl,dbf均是用lv做的裸设备。其中dbf是使…

cmake的使用方法: 编译生成库文件

一. 简介 前面文章学习了针对单个 .c文件,cmake 工具是如何编译的? 针对包含多个 .c文件,cmake工具又是如何编译的?文章如下: cmake的使用方法: 单个源文件的编译-CSDN博客 cmake的使用方法: 多个源文件的编译-CS…

Java入门-final关键字

final关键字 修饰基本类型 变量为只读,不能修改变量的内容。 final int SIZE 3;修饰引用类型 引用的对象不能改变,但是对象的内容可以修改。 final Car c new Car( );c.setColor("红色");修饰类的属性 类的属性不能被修改。 第一种方式&…

Linux 进程间通信之命名管道

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux知识分享⏪   🚚代码仓库:Linux代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 目录 前言 命名管道 创建一个命名管道 …

Leetcode—976. 三角形的最大周长【简单】(ranges::sort函数)

2024每日刷题&#xff08;122&#xff09; Leetcode—976. 三角形的最大周长 实现代码 class Solution { public:int largestPerimeter(vector<int>& nums) {ranges::sort(nums);for(int i nums.size() - 1; i > 1; i--) {if(nums[i - 1] nums[i - 2] > nu…

洛谷 P1377 [TJOI2011]:树的序 ← 笛卡尔树

【题目来源】https://www.luogu.com.cn/problem/P1377【题目描述】 众所周知&#xff0c;二叉查找树的形态和键值的插入顺序密切相关。准确的讲&#xff1a; 1.空树中加入一个键值 k&#xff0c;则变为只有一个结点的二叉查找树&#xff0c;此结点的键值即为 k。 2.在非空树中插…

智能物联网与Web3:连接未来数字生活的桥梁

随着科技的不断进步&#xff0c;智能物联网&#xff08;IoT&#xff09;和Web3技术正成为数字化时代的关键驱动力。智能物联网将各种物理设备连接到互联网&#xff0c;使其能够感知环境、收集数据并与其他设备通信&#xff0c;而Web3技术则以去中心化、安全性和透明性为核心&am…