java引用相关(四大引用类型,软引用避免oom,弱引用表,虚引用和引用队列,可达性分析算法)

1. 什么是引用?

问题:什么是引用?Java中的引用是如何工作的?

答案

  • 引用 是对象的句柄,用于访问堆内存中的对象。
  • 在Java中,引用变量实际上存储的是对象的地址,而不是对象本身。
  • 通过引用,可以访问对象的属性和方法。

2. Java中的引用类型有哪些?

问题:Java中有哪几种引用类型?

答案

  • 强引用(Strong Reference):最常见的引用类型,如 Object obj = new Object()。只要强引用存在,垃圾回收器就不会回收被引用的对象。
  • 软引用(Soft Reference):通过 SoftReference 类实现。在内存不足时,垃圾回收器会回收软引用指向的对象。
  • 弱引用(Weak Reference):通过 WeakReference 类实现。垃圾回收器在每次垃圾回收时都会回收弱引用指向的对象。
  • 虚引用(Phantom Reference):通过 PhantomReference 类实现。虚引用不会影响对象的生命周期,主要用于在对象被垃圾回收时收到通知。

3. 强引用和软引用有什么区别?

问题:强引用和软引用有什么区别?

答案

  • 强引用:只要强引用存在,垃圾回收器就不会回收被引用的对象。即使内存不足,也不会回收强引用的对象,可能会导致 OutOfMemoryError
  • 软引用:在内存不足时,垃圾回收器会回收软引用指向的对象。软引用通常用于实现内存敏感的缓存。

4. 什么是弱引用?它的应用场景是什么?

问题:什么是弱引用?它的应用场景是什么?

答案

  • 弱引用:通过 WeakReference 类实现。垃圾回收器在每次垃圾回收时都会回收弱引用指向的对象。
  • 应用场景
    • 缓存:用于实现内存敏感的缓存,当内存不足时,可以自动释放缓存对象。
    • 监听器:在事件处理中,为了避免内存泄漏,可以使用弱引用来存储监听器。

5. 什么是虚引用?它的应用场景是什么?

问题:什么是虚引用?它的应用场景是什么?

答案

  • 虚引用:通过 PhantomReference 类实现。虚引用不会影响对象的生命周期,主要用于在对象被垃圾回收时收到通知。
  • 应用场景
    • 资源清理:在对象被垃圾回收时,执行一些资源清理工作,如关闭文件句柄、释放资源等。

6. 如何判断一个对象是否被垃圾回收了?

问题:如何判断一个对象是否被垃圾回收了?

答案

  • 可以使用 PhantomReference 来判断对象是否被垃圾回收。当对象被垃圾回收时,PhantomReferenceget 方法会返回 null
  • 可以将 PhantomReference 添加到 ReferenceQueue 中,当对象被垃圾回收时,ReferenceQueue 会收到通知。

7. 引用传递是按值传递还是按引用传递?

问题:Java中的引用传递是按值传递还是按引用传递?

答案

  • 按值传递:Java中的参数传递是按值传递的。对于基本类型,传递的是值的副本;对于引用类型,传递的是引用的副本。
  • 按引用传递的副本:传递的是对象引用的副本,而不是对象本身。因此,可以通过引用修改对象的状态,但不能改变引用本身。

8. 如何避免内存泄漏?

问题:如何避免内存泄漏?

答案

  • 及时释放引用:不再使用的对象要及时释放引用,避免长时间持有无用对象的引用。
  • 使用弱引用:在缓存和监听器等场景中,使用弱引用来避免内存泄漏。
  • 静态变量谨慎使用:静态变量的生命周期与类相同,容易导致内存泄漏。
  • 关闭资源:及时关闭文件句柄、数据库连接等资源,避免资源泄漏。

9. 什么是引用计数法?Java的垃圾回收器是否使用引用计数法?

问题:什么是引用计数法?Java的垃圾回收器是否使用引用计数法?

答案

  • 引用计数法:每个对象都有一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器减1。当计数器为0时,对象可以被回收。
  • Java的垃圾回收器:Java的垃圾回收器不使用引用计数法,而是使用可达性分析算法(Reachability Analysis)。通过从根节点(如栈帧中的局部变量表、方法区中的类静态属性)出发,遍历所有可达对象,未被遍历到的对象被视为垃圾,可以被回收。

10. 什么是可达性分析算法?

问题:什么是可达性分析算法?

答案

  • 可达性分析算法:从一系列称为“GC Roots”的对象开始,向下搜索,走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,证明此对象是不可达的,可以被垃圾回收。
  • GC Roots:包括栈帧中的局部变量表、方法区中的类静态属性、本地方法栈中的JNI引用等。

11. 什么是弱引用表?它在垃圾回收中的作用是什么?

问题:什么是弱引用表?它在垃圾回收中的作用是什么?

答案

  • 弱引用表:垃圾回收器在进行垃圾回收时,会维护一个弱引用表,记录所有弱引用的对象。
  • 作用:在垃圾回收过程中,垃圾回收器会检查弱引用表中的对象,如果这些对象没有其他强引用,就会被回收。弱引用表主要用于实现内存敏感的缓存和资源管理。

12. 如何使用 WeakHashMap

问题:如何使用 WeakHashMap

答案

  • WeakHashMap:是一个基于弱引用的哈希表,键是弱引用,值可以是任意引用类型。
  • 使用场景:适用于实现内存敏感的缓存,当键对象被垃圾回收时,对应的条目也会被移除。
  • 示例代码
    import java.util.WeakHashMap;public class WeakHashMapExample {public static void main(String[] args) {WeakHashMap<String, String> map = new WeakHashMap<>();String key = new String("key");map.put(key, "value");System.out.println(map.get(key)); // 输出 "value"key = null;System.gc(); // 请求垃圾回收// 垃圾回收后,键对象被回收,对应的条目也被移除System.out.println(map.get("key")); // 输出 null}
    }
    

13. 什么是引用队列?如何使用?

问题:什么是引用队列?如何使用?

答案

  • 引用队列ReferenceQueue 是一个队列,用于接收被垃圾回收器回收的引用对象。
  • 使用场景:通常与 PhantomReference 一起使用,用于在对象被垃圾回收时收到通知。
  • 示例代码
    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(); // 请求垃圾回收// 检查引用队列PhantomReference<?> ref = (PhantomReference<?>) queue.poll();if (ref != null) {System.out.println("对象已被垃圾回收");}}
    }
    

14. 什么是引用逃逸?如何避免?

问题:什么是引用逃逸?如何避免?

答案

  • 引用逃逸:在对象构造过程中,对象的引用被外部访问,导致对象在未完全构造完成的情况下被使用。
  • 避免方法
    • 私有化构造函数:将构造函数设为私有,通过工厂方法创建对象。
    • 避免在构造函数中传递引用:不要在构造函数中将对象的引用传递给外部方法。
    • 使用 final 修饰符:将对象的属性设为 final,确保对象的不可变性。

15. 什么是引用透明性?Java中的引用是否透明?

问题:什么是引用透明性?Java中的引用是否透明?

答案

  • 引用透明性:在一个表达式中,如果可以用一个值替换另一个值而不改变程序的行为,那么这个表达式就是引用透明的。
  • Java中的引用:Java中的引用不是完全透明的,因为引用的赋值和传递可能会改变对象的状态。但是,对于不可变对象(如 String),引用是透明的。

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

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

相关文章

十一、容器化 vs 虚拟化-Docker

文章目录 前言一、Docker 介绍1. 简介2. 应用场景3. 特点4. Docker和虚拟机之间的区别5. 解决痛点1. 解决依赖兼容2. 解决操作系统环境差异3. 小结 二、Docker 架构三、工作流程五、Docker 核心组件及其工作机制1. Docker 客户端&#xff08;Docker Client&#xff09;2. Docke…

linux学习笔记01 基础命令

目录 创建 touch 创建文件 &#xff08;创建但是不打开&#xff09; vi / vim 创建文件 (创建一个文件并打开) mkdir 创建文件夹 切换目录 cd 查看 pwd 查看当前目录完整路径 ls 查看目录信息 dir 查看目录信息 ll 表示查看目标目录下的信息 ls -a 查看当前目录下的…

【深度学习】深刻理解多模态模型CLIP

CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09; 是由 OpenAI 提出的一个多模态模型&#xff0c;旨在学习视觉和语言的联合表示&#xff0c;能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图…

android 聊天界面键盘、表情切换丝滑

1、我们在聊天页面时候&#xff0c;往往会遇到&#xff0c;键盘、表情、其他选择切换时候页面会出现掉下来再弹起问题&#xff0c;这是因为&#xff0c;我们切换时候&#xff0c;键盘异步导致内容View高度变化&#xff0c;页面掉下来后&#xff0c;又被其他内容顶起这种很差视觉…

Nginx 缓存系统 proxy_cache详解

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行&#xff1b;当前是秒级时间戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者&#xff0c;我总喜欢翻看各种项目附带的论文&#xff0c;虽然大多时候是瞎研究&#xff0c;但却乐在其中。该项目能够完美保留公式、图表、目录和注释&#xff0c;对于需要阅读外文文献的…

网络药理学:(待更)Alphafold3和批量分子动力学模拟(Desmond、AutoMD)

批量动力学模拟 注意全都需要在类linux平台上进行 安装Desmond模块&#xff1a; https://github.com/Wang-Lin-boop/Schrodinger-Script 安装AutoMD模块&#xff1a; Wang-Lin-boop/CADD-Scripts: Scripts for virtual screening, cross docking and protein relax using Sc…

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况&#xff0c;就是爬虫最初是正常运行、正常抓取数据的&#xff0c;一切看起来都是那么美好&#xff0c;然而一杯茶的工夫就出现了错误&#xff0c;例如 403 Forbidden&#xff0c;这时打开网页一看&#xff0c;可能会看到“您的IP访问频率太…

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题③

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题③ 模块A 基础设施设置与安全加固(200分)A-1 登录安全加固&#xff08;Windows, Linux&#xff09;A-2 Nginx安全策略&#xff08;Linux&#xff09;A-3日志监控&#xff08;Windows&#xff09;A-4中间件…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件 在根目录下app文件夹下controller文件夹下common文件夹下&#xff0c;修改Login.php&#xff0c;代码如下 <?php /*** 登录退出操作* User: 龙哥三年风水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戏开发] Unity中使用FlatBuffer

什么是FlatBuffer 官网&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 为什么用FloatBuffer&#xff0c…

MySQL其一,概念学习,可视化软件安装以及增删改查语句

目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、编写SQL语句 6、DDL语句 7、DML 新增数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; MySQL SQL其实是一门…

05 在 Linux 使用 AXI DMA

DMA简介 DMA 是一种采用硬件实现存储器与存储器之间或存储器与外设之间直接进行高速数据传输的技术&#xff0c;传输过程无需 CPU 参与&#xff08;但是CPU需要提前配置传输规则&#xff09;&#xff0c;可以大大减轻 CPU 的负担。 DMA 存储传输的过程如下&#xff1a; CPU 向…

linux 安装 vsftpd 服务以及配置全攻略,vsftpd 虚拟多用户多目录配置,为每个用户配置不同的使用权限

linux 安装 vsftpd 服务以及配置全攻略&#xff0c;vsftpd 虚拟多用户多目录配置&#xff0c;为每个用户配置不同的使用权限。 linux 安装 vsftpd 服务以及配置全攻略 FTP 是 File Transfer Protocol 的简称&#xff0c;用于 Internet 上的控制文件的双向传输。同时&#xff0…

SQL语句在MySQL中如何执行

MySQL的基础架构 首先就是客户端&#xff0c;其次Server服务层&#xff0c;大多数MySQL的核心服务都在这一层&#xff0c;包括连接、分析、优化、缓存以及所有的内置函数&#xff08;时间、日期、加密函数&#xff09;&#xff0c;所有跨存储引擎功能都在这一层实现&#xff1…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

力扣-汉明距离

1.两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 看到这题&#xff0c;当然想到了按位异或^,并且c内置了计算二进制数中1数量的函数__builtin_popcount() class Solution { publ…

关于成功插入 SQLite 但没有数据的问题

背景 技术栈&#xff1a;SpringBoot Mybatis-flex SQLite 项目中集成了SQLite&#xff0c;配置如下&#xff1a; spring:datasource:url: jdbc:sqlite::resource:db/project.dbdriver-class-name: org.sqlite.JDBC在进行测试时&#xff0c;使用Mybatis-flex往表中插入数据&…