再谈有关JVM中的四种引用

1.强引用

强引用就是我们平时使用最多的那种引用,就比如以下的代码

//创建一个对象
Object obj = new Object();//强引用

这个例子就是创建了一个对象并建立了强引用,强引用一般就是默认支持的当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会回收对象。即使在解除对对象的强引用后,只要系统内存充足,垃圾回收器不会立即回收对象。强引用使得对象在被引用时一直保持有效,直到引用被显式解除。

以下三种引用就是比较不常见的了,这三种引用虽然叫引用但是和我们理解的那种栈上的变量指向堆上的对象的指针不是一回事。

千万不要将软弱虚这三种引用理解为那种栈上的变量指向堆上的对象的指针。

软引用、弱引用、虚引用:这三种引用其实就是一个个的类,通过对应的类名翻译过来的中文名称。

// 软引用
public class SoftReference<T> extends Reference<T> {}// 弱引用
public class WeakReference<T> extends Reference<T> {}// 虚引用
public class PhantomReference<T> extends Reference<T> {}

 

2.软引用

发生了垃圾回收,并且回收后内存仍然不足,并且被软引用指向的对象没有强引用,那么被软引用指向的对象就会被回收。

public class SoftReferenceDemo {public static void main(String[] args) {Object a = new Object();SoftReference softReference = new SoftReference<>(a);//软引用//a和软引用指向同一个对象System.out.println(a);//java.lang.Object@4554617cSystem.out.println(softReference.get());//java.lang.Object@4554617c//内存够用,软引用不会被回收a = null;System.gc();//内存够用不会自动gc,手动唤醒gcSystem.out.println(a);//nullSystem.out.println(softReference.get());//java.lang.Object@4554617c//内存不够用时try{//配置Xms和Xmx为5MBbyte[] bytes = new byte[1024102430];//设置30MB超内存}catch (Throwable e){e.printStackTrace();}finally {System.out.println(a);//nullSystem.out.println(softReference.get());//null}}
}

第一步

第二步撤了对a对象的强引用只剩软引用了,手动唤醒gc对象被清除了

3.弱引用

弱引用(Weak Reference)是Java中一种比强引用更弱的引用类型。当一个对象只被弱引用关联时,在下一次垃圾回收时,该对象就有可能被回收。垃圾回收器会在适当的时候回收仅被弱引用持有的对象,即使内存并不紧张。

public class WeakReferenceDemo {public static void main(String[] args) {// 创建一个对象并建立弱引用Object obj = new Object();WeakReference<Object> weakRef = new WeakReference<>(obj);// 对象仍然存在,可以正常使用System.out.println("Object is still accessible: " + weakRef.get());// 解除对对象的强引用obj = null;// 手动触发垃圾回收System.gc();// 垃圾回收后,对象被回收,弱引用返回nullSystem.out.println("Object after garbage collection: " + weakRef.get());}}

  • 软引用和弱引用一般都可以被用于实现内存敏感的缓存
  • ThreadLocalMap中的entry实体就是一个弱引用
static class ThreadLocalMap {// Entry是一个弱引用static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}
}

为什么要在ThreadLocal中使用弱引用?

先简单说一下在 ThreadLocal 的实现中,它使用了一个名为 ThreadLocalMap 的哈希表来存储每个线程的局部变量。这个 ThreadLocalMap 的键(Key)是 ThreadLocal 对象的弱引用,而值(Value)则是与线程相关联的实际对象。

1.防止内存泄露:使用弱引用允许 JVM 在内存紧张时回收 ThreadLocal 对象,而不必等待整个ThreadLocalMap 被显式清理。这种灵活性有助于更好地管理内存,特别是在高负载或长时间运行的应用程序中。

2.灵活的内存管理:使用弱引用允许 JVM 在内存紧张时回收 ThreadLocal 对象,而不必等待整个 ThreadLocalMap 被显式清理。这种灵活性有助于更好地管理内存,特别是在高负载或长时间运行的应用程序中。

4.虚引用

虚引用(Phantom Reference)是Java中最弱的引用类型之一,无法通过引用直接获取到对象实例。虚引用主要用于跟踪对象被垃圾回收的状态。当一个对象只被虚引用关联时,其实际上并不影响对象的生命周期,也就是说,垃圾回收器随时可能回收被虚引用关联的对象,我们甚至无法通过get方法获取到对象实例。

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

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

相关文章

防火墙的冗余基础知识+实验检测

将之前先理清需要注意的知识点&#xff1a; 1、注意防火墙冗余时的会话表必须保持一致&#xff0c;这里HRP技术已经做到 2、vrrp是自动开启抢占的&#xff0c;且是根据优先级进行抢占的 3、免费ARP的作用&#xff1a;告诉交换机的某个IP的mac地址变成了我的这个mac地址 4、HRP …

C++ | Leetcode C++题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; class Solution { private:static constexpr int BIG 1 << 30;public:bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0;} };

强化学习——多臂老虎机问题(MAB)【附python代码】

文章目录 一、问题描述1.1 问题定义1.2 形式化描述1.3 累积懊悔1.4 估计期望奖励 二、解决方法2.1 ϵ-贪婪算法2.2 上置信界算法2.3 汤普森采样算法2.4 小结 一、问题描述 1.1 问题定义 有一个用于 K 根拉杆的老虎机&#xff0c;每一根拉杆都对应一个关于奖励的概率分布 R 。每…

【C++题解】1154. 数组元素的查找

问题&#xff1a;1154. 数组元素的查找 类型&#xff1a;数组找数 题目描述&#xff1a; 给你 m 个整数&#xff0c;查找其中有无值为 n 的数&#xff0c;有则输出该数第一次出现的位置,没有则输出 −1 。 输入&#xff1a; 第一行一个整数 m 代表数的个数 ( 0≤m≤100 ) 。…

Qt基础 | Qt全局定义 | qglobal头文件中的数据类型、函数、宏定义

文章目录 一、数据类型定义二、函数三、宏定义 QtGlobal头文件包含了 Qt 类库的一些全局定义 &#xff0c;包括基本数据类型、函数和宏&#xff0c;一般的Qt类的头文件都会包含该文件。 详细内容可参考&#xff1a;https://doc.qt.io/qt-5/qtglobal.html 一、数据类型定义 为了…

数据可视化在智慧医疗中的重要应用

在现代智慧医疗的推动下&#xff0c;数据可视化技术正日益成为医疗领域的重要工具。通过将复杂的医疗数据转换为直观的图表和图形&#xff0c;数据可视化不仅提升了医疗服务的效率&#xff0c;还极大地改善了患者的就医体验。 在智慧医疗中&#xff0c;数据可视化首先在电子病历…

客流统计系统优化景区服务流程,增强游客满意度

在当今旅游业蓬勃发展的时代&#xff0c;景区面临着越来越多的挑战和机遇。如何提供更优质、更高效的服务&#xff0c;满足游客日益增长的需求&#xff0c;成为了景区管理者们关注的焦点。客流统计系统作为一种创新的技术手段&#xff0c;正逐渐成为优化景区服务流程、增强游客…

MySQL主从同步的原理与思考

摘要 分析主从同步出现的原因&#xff0c;MySQL实现主从同步的原理&#xff0c;思考实现原理的局限性和优点 背景 在实际应用中主从同步常用于实现备份、负载均衡和高可用。数据冗余的目的是提高数据的安全性&#xff0c;避免因磁盘损坏导致数据丢失的问题。读写分离的目的是…

ubuntu系统Docker常用命令

1.查看docker是否开机启动 sudo systemctl list-unit-files | grep enable|grep docker 2.设置开机启动 sudo systemctl enable docker 3.关闭docker开机启动 sudo systemctl disable docker 4.开启docker服务 sudo service docker start 5.关闭docker服务 sudo servi…

基于CNN的MINIST手写数字识别项目代码以及原理详解

文章目录 项目简介项目下载地址项目开发软件环境项目开发硬件环境前言一、数据加载的作用二、Pytorch进行数据加载所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加载项目需要使用的库 三、加载MINIST数据集3.1 数据集简介3.2 数据预处理3.3 加载数据集 四…

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的数据类型&#xff08;字符、数字、矩阵、字符串和元胞&#xff09;合并为字符串&#xff0c;然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码&#xff0c;展示如何将不同数据类型合并为字符串&#xff0c;并以不…

重生奇迹mu魔法师瞬间移动技能

瞬间移动是勇士大陆魔法师所拥有的一项技能。一开始&#xff0c;许多玩家对这种技能的用处感到困惑。实际上&#xff0c;这种技能只能在游戏中不同的位置间进行移动&#xff0c;不能随机传送到地图的其他坐标位置。 一位重生奇迹mu魔法师在PK中不小心使用了一项技能&#xff0c…

【仿真建模-anylogic】数据源组件

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-16 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 仿真模型依赖的数据源通常有Excel文件、MySQL数据库两种&#xff1b;针对小数量、大数据量以及是否允许外部依赖等场景设计了一…

labview使用斑马打印机打印标签

使用ZebraDesigner 3设计标签样式 设计完成后打印至文件&#xff0c;生成prn文件 用记事本打开prn文件 ^MMT 标签撕下 ^MMP 标签剥离 按照需求替换FD--------^FS中间内容

路由上传一个ui_control参数(uint32类型)控制页面UI显隐

前言&#xff1a;传一个uint32类型的值&#xff0c;通过 按位或操作符&#xff08;|&#xff09;来设置ui_control的值&#xff0c;通过按位与操作符&#xff08;&&#xff09;来检测是否显示或隐藏 简单介绍一下两个概念&#xff1a; 按位与操作符和按位或操作符都是二进…

etcd的备份与恢复

一 为什么使用etcd 与ZooKeeper相比&#xff0c;etcd更简单&#xff0c;安装、部署和使用更加容易&#xff0c;并且etcd的某些功能是ZooKeeper所没有的。因此&#xff0c;在很多场景下&#xff0c;etcd 比ZooKeeper更受用户的青&#xff0c;具体表现在如下几个方面: 1 etcd更…

上海市计算机学会竞赛平台2022年10月月赛丙组门禁记录

题目描述 小爱得到了某大楼一天内按时间顺序记录的&#x1d45b;n条门禁出入记录&#xff0c;每条记录由两个字符串组成&#xff0c;第一个字符串为出入人员姓名&#xff0c;第二个字符串表示该人员进出状态、为 enter 或 exit 中一项&#xff0c;其中 enter 为进入&#xff0…

鑫创SSS1700USB音频桥芯片USB转IIS芯片

鑫创SSS1700支持IIC初始外部编&#xff08;EEPROM选项),两线串行总线&#xff08;I2C总线&#xff09;用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM&#xff08;24C02~24C16&#xff09;接口&#xff0c;用于客户特定的USB视频、PID、…

jmeter之变量随机参数化以及解决多线程不会随机变化

参考链接&#xff1a; https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函数多线程运行时数据不会随机变化&#xff1f;_jmeter 线程组循环执行时 变量不变-CSDN博客 1、如下图所示&#xff0c;需要对请求参数 autor 和phone进行随机参数化 2、目前有…

MyBatis源码中的设计模式2

组合模式的应用 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合成树形结构以表示整体和部分的层次结构。组合模式可以让用户统一对待单个对象和对象的组合。 比如&#xff1a;Windows操作系统中的目录结构&#xff0c;通过tree命令实现树形结构展…