Java中的Reference

1. 常用四种引用

快速记忆法:“硬(俗称的强引用) --> 软(SoftReference) --> 弱(WeakReference) --> 虚(PhantomReference)”
此处将常说的“强引用”记忆成“硬引用”可以对应到次席的“软引用”(反义词:硬-软)这样更容易记住

a. 强引用

平常我们代码中写到的引用类型都是强引用类型,比如Object obj = new Object();, Object实例就有一个强引用类型指向它,在GC过程中即使发生OOM,该Object实例都不会被回收。

b. 软引用 - SoftReference

定义方式:SoftReference sr = new SoftReference(new Object()); 一个对象的实例被一个软引用实例指向,那么在GC过程中发生OOM之前,该Object对象实例会被回收掉,在内存充足的情况下是不会被回收的。同时可以将一个引用队列关联到该软引用上,在软引用指向的对象被回收后,该软引用会被加入到关联的引用队列中。我们可以通过Reference的get()方法获取到该软引用指向的对象实例。

c. 弱引用 - WeakReference

弱引用基本上同上面的软引用类似,WeakReference wr = new WeakReference(new Object());,但是特殊点就是在它被创建后的下一次GC时候其指向的对象实例会被回收掉,不管内存是不是充足,反正就是活不过一次GC。JDK中的WeakHashMap就是使用到WeakReference,其Key就是被包装成WeakReference。

d. 虚引用 - PhantomReference

定义方式:PhantomReference pr = new PhantomReference(new Object(), new ReferenceQueue()),虚引用对象再被定义时,必须指定一个引用队列实例。JDK文档中介绍它主要用于对象被回收前资源的释放操作,替换finalize()方法。它和前面的两个软引用和弱引用不同的地方有两点:

2. 验证

虚引用在对象被回收之前添加到引用队列中,同时需要手动处理,它指向的对象才会被回收

思路:

a. 创建一个虚引用对象,然后发起一次GC操作,查看其指向的对象实例是否被回收

b. 通过检测它关联的引用队列,取出加入的虚引用对象,查看此时其指向的对象实例是否被回收

c. 调用虚引用对象的clear方法之后,查看其指向的对象实例是否被回收

2.1. 代码

public class ReferenceApp1 {public static void main(String[] args) throws Exception {phantom();}/*** 验证PhantomReference* @throws Exception*/private static void phantom() throws Exception {// 步骤1. 定义一个InnerPhantomRefObj对象实例InnerPhantomRefObj innerPhantomRefObj = new InnerPhantomRefObj();innerPhantomRefObj.setName("InnerPhantomRefObj-1");ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();// 步骤2. 定义一个虚引用对象PhantomReference<Object> phtRef = new PhantomReference<>(innerPhantomRefObj, referenceQueue);// 移除InnerPhantomRefObj对象实例上的强引用,不然后面操作不会被回收innerPhantomRefObj = null;System.err.println("before gc | get PhantomReference referent:" + phtRef.get());// 步骤3. 发起GC操作System.gc();int i = 0;Reference tmp = null;while(true) {System.out.println("phantom iteration >>>> " + ++i);Thread.sleep(5000);if(i == 1) {// 步骤4. 从引用队列中取出虚引用对象tmp = referenceQueue.poll();if(tmp != null) {System.err.println("get PhantomReference from ReferenceQueue");}// 发起一次GC操作,其实此时InnerPhantomRefObj对象不会被回收System.gc();}if(i == 5) {if(tmp != null) {System.err.println("after gc | get PhantomReference referent:" + tmp.get());// 步骤5. 调用虚引用上的clear方法,让下一次GC操作回收掉InnerPhantomRefObj对象tmp.clear();// 或者让GC操作释放PhantomReference对象实例
//                    tmp = null;
//                    phtRef = null;System.err.println("clear PhantomReference");// 发起一次GC操作System.gc();}}if(i == 10) {break;}}}@Dataprivate static class InnerPhantomRefObj {private String name;}
}

2.2. 观察VisualVM中实例个数变化判断是否被回收

a. 从上述代码的步骤1到步骤5之间的实例统计截图如:(实例个数为1,没有被回收)

b. 执行步骤5(调用PhantomReference的clear方法)之后的实例统计截图如:(实例个数为0,已被被回收)

在Java 8以及之前的版本中,在虚引用回收后,虚引用指向的对象才会回收。在Java 9以及更新的版本中,虚引用不会对对象的生存产生任何影响。

3. 类比

看到一篇英文博客中用一个例子来类比软、弱、虚引用三者之间的差别非常好,在此借用一下:

比如一个快餐店中,桌子座位有限,服务员会随时清理桌子座位,你进去点单,找到一个座位坐下,会存在下面几种情况

a. 然后后面有很多人过来点单时,当座位不够时你会让出座位,但在此之前每次服务员过来清理座位时你都没有让出座位,这种情况就像就像软引用

b. 第一次服务员过来清理桌子座位时,你就让出座位,这种情况就像弱引用

c. 第一次服务员过来清理桌子座位时,你可以随时准备让出座位,其实这时候你并没有让出位置,但是后面服务员说出一句让你让出座位时你才会让出座位,这种情况就像虚引用

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

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

相关文章

SAP-QM-质检操作

一、系统自动创建检验批 1、物料主数据设置 MM03-质量管理-检验设置-04来自生产收货的检验 检验类型 过账到检验库存&#xff1a;勾选进入检验库存 控制检验批&#xff1a;控制检验批的产生方式&#xff0c;按订单产生、按行产生、按凭证产生&#xff0c;例每个物料凭证项目…

C++进阶之多态

多态 多态的概念多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写4.虚函数重写的两个例外5.C11 override 和 final6.重载、覆盖(重写)、隐藏(重定义)的对比 抽象类1.概念2.接口继承和实现继承 多态的原理1.虚函数表2.多态的原理3.动态绑定与静态绑定 单继承和多继承关系…

ArcGIS将两个相同范围但不同比例或位置的矢量数据移动到相同位置

有两个市图层&#xff0c;一个是正确经纬度的市行政范围图层&#xff0c;另一个是其他软件导出获取的不正确经纬度信息或缺失信息。 如果单纯的依靠移动图层&#xff0c;使不正确的移动到正确位置需要很久。尝试定义投影等也不能解决。 使用ArcMap 的空间校正工具条&#xff…

Python 案例实训教学,支持“教师-学生”双视角切换|ModelWhale 版本更新

学年伊始、辞旧迎新&#xff0c;金秋九月&#xff0c;ModelWhale 迎来新一轮的版本更新&#xff0c;持续优化你的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; • 新增 “教师-学生”双视角切换&#xff08;团队版✓&#xff09; • 新…

Stable Diffusion中的ControlNet插件

文章目录 ControlNet的介绍及安装ControlNet的介绍ControlNet的安装 ControlNet的功能介绍ControlNet的应用与演示 ControlNet的介绍及安装 ControlNet的介绍 ControlNet 的中文就是控制网&#xff0c;本质上是Stable Diffusion的一个扩展插件&#xff0c;在2023年2月份由斯坦…

Android微信数据库解密2

Android微信数据库解密2 上篇文章讲了下微信数据库密码规则,以及相关的代码. 本篇文章主要讲解下使用xpose获取对应的数据库密码. public class HookModule implements IXposedHookLoadPackage {public static final String TAG "HookModule";Overridepublic voi…

git文件夹内容详解

.git文件夹是Git版本控制系统在项目根目录下创建的隐藏文件夹&#xff0c;包含了Git仓库的所有相关信息。如下是.git文件夹中常见的一些内容及其作用&#xff1a; HEAD&#xff1a;指向当前所在的分支&#xff08;或者是一个特定的提交&#xff09;。 branches&#xff1a;存储…

详解排序算法(附带Java/Python/Js源码)

冒泡算法 依次比较两个相邻的子元素&#xff0c;如果他们的顺序错误就把他们交换过来&#xff0c;重复地进行此过程直到没有相邻元素需要交换&#xff0c;即完成整个冒泡&#xff0c;时间复杂度。 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换它们两个&#xff1b;…

为何电商行业都在争相使用WhatsApp引流小挂件?

WhatsApp小挂件是嵌入在网站上的聊天小部件&#xff0c;允许访问者同WhatsApp与您联系。点击后&#xff0c;它会将客户带到移动或桌面 WhatsApp应用程序&#xff0c;或者直接打开一个对话框&#xff0c;客户可以在这些地方与您发起对话。让我们看看在您的网站上拥有WhatsApp聊天…

常用激活函数整理

最近一边应付工作&#xff0c;一边在补足人工智能的一些基础知识&#xff0c;这个方向虽然新兴&#xff0c;但已是卷帙浩繁&#xff0c;有时不知从何入手&#xff0c;幸亏有个适合基础薄弱的人士学习的网站&#xff0c;每天学习一点&#xff0c;积跬步以至千里吧。有像我一样学…

PHP多语言代入电商平台api接口采集拼多多根据ID获取商品详情原数据示例

拼多多商品详情原数据API接口的作用是获取拼多多电商平台上某一商品的详细信息&#xff0c;包括商品的标题、价格、库存、图片、描述、包邮信息、销量、评价、优惠券等数据。通过该API接口可以获取到商品的原始数据&#xff0c;用于分析、筛选和展示商品信息。 pinduoduo.item…

复习之docker部署--项目实战

一、实验环境 1.安装7.6虚拟机 最小化安装&#xff0c;不安装图形&#xff01; 2.封装虚拟机 关闭selinux关闭防火墙关闭networkmanager配置网络&#xff0c;保证可以ssh修改主机名添加双向解析配置7.6网络仓库--安装常用的工具 配置完成后&#xff0c;在真机ssh虚拟机 如果…

在Mac终端使用unrar和rar 解压和压缩软件

1、首先从rarlab 网站下载 rar &#xff0f; unrar 工具 rarlab网站&#xff1a; https://www.rarlab.com/download.htm 2、解压缩下载的 tar.gz 压缩包&#xff08;rarmacos-x64-623.tar.gz&#xff09;&#xff0c;在下载目录downloads下自动创建一个rar的目录&#xff0c;其…

从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置

1. SSH 无密登录配置 1.1 配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的IP地址 &#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [atguiguhadoop102 ~]$ ssh hadoop103&#xff08;3&#xff09;回退到 hadoop102 [at…

bazel入门学习笔记

简介 Bazel Google开源的&#xff0c;是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目&#xff0c;可为多个平台构建输出。Bazel支持任意大小的构建目标&#xff0c;并支持跨多个代码库和大量用户的大型代…

登录校验-Filter-登录校验过滤器

目录 思路 登录校验Filter-流程 步骤 流程图 登录校验Filter-代码 过滤器类 工具类 测试登录 登录接口功能请求 其他接口功能请求 前后端联调 思路 前端访问登录接口&#xff0c;登陆成功后&#xff0c;服务端会生成一个JWT令牌&#xff0c;并返回给前端&#xff0…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Unity Canvas动画不显示的问题

问题描述: 我通过角色创建了一个walk的动画&#xff0c;当我把这个动画给到Canvas里面的一个image上&#xff0c;这个动画就不能正常播放了&#xff0c;经过一系列的查看我才发现&#xff0c;canvas里面动画播放和非canvas得动画播放&#xff0c;他们的动画参数是不一样的。一个…

2D-2D对极几何中的基本矩阵、本质矩阵和单应矩阵

本文主要参考高翔博士的视觉SLAM十四讲第二版中的7.3章节内容。文章目录 1 对极约束2 本质矩阵E3 单应矩阵 1 对极约束 现在&#xff0c;假设我们从两张图像中得到了一对配对好的特征点&#xff0c;如图7.9所示&#xff08;假如后面我们有若干对这样的匹配点&#xff0c;根据这…

高效使用WMS仓储管理系统,需要关注这八个点

在现代供应链中&#xff0c;WMS仓储管理系统扮演着至关重要的角色。然而&#xff0c;随着供应链需求的不断增长和变化&#xff0c;实施WMS仓储管理系统面临着越来越多的挑战和要求。本文将探讨使用WMS仓储管理系统需要考虑的8大因素&#xff0c;以适应现代供应链的需求。 一、W…