Java基础实战:Java中的引用类型(强软弱虚)

news2024/9/24 1:25:18

下面是一个在下面引用实战中用到的公共类

public class M {
    @Override
    protected void finalize() throws Throwable{
        System.out.println("finalize");
    }
}

finalize()方法是执行gc时调用的方法。

一、强引用

  • 强引用是默认的引用类型。
  • 当一个对象具有强引用时,垃圾收集器不会回收该对象。
  • 只有在没有任何强引用指向一个对象时,该对象才会被垃圾收集器回收。
public class T01_NormalReference {
    public static void main(String[] args) throws IOException {
        M m = new M();
        m = null;
        System.gc();
        System.in.read();
    }
}

执行上面程序,结果如下。结果证明M被回收了。

二、软引用

  • 软引用用于描述一些还有用但不是必需的对象。
  • 当内存不足时,垃圾收集器会回收软引用指向的对象。
  • 可用于实现内存敏感的高速缓存。

软引用是一种用于描述一些还有用但不是必需的对象的引用类型,当内存不足时,垃圾收集器会回收软引用指向的对象。以下是一个验证软引用的示例代码:

public class T02_SoftReference {
    public static void main(String[] args) {
        SoftReference<byte[]> m = new SoftReference<>(new byte[1024*1024*10]);
        //m = null;
        System.out.println(m.get());
        System.gc();
        try {
            Thread.sleep(500);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println(m.get());
        // 模拟内存不足的情况
        try {
            // 分配大量内存,让系统触发垃圾回收
            byte[] memoryAlloc = new byte[1024 * 1024 * 15]; // 分配10MB的内存
        } catch (OutOfMemoryError e) {
            System.out.println("内存不足,系统触发了垃圾回收");
        }
        System.out.println(m.get());
    }
}

在这里插入图片描述
配置程序执行的最大内存为20M,执行结果如下
在这里插入图片描述
在这个示例中,我们首先创建一个字符串对象,并将其放入软引用中。然后,我们清空了强引用,使字符串对象只能被软引用引用。接下来,我们模拟了内存不足的情况,分配了大量内存,这将导致系统触发垃圾回收。最后,我们再次从软引用中获取对象,并检查对象是否被回收。

运行示例代码后,你会看到当内存不足时,垃圾收集器会回收软引用中的对象,软引用变为null,表示对象已被回收。这演示了软引用在内存管理中的作用。

三、弱引用

  • 弱引用用于描述非必需对象,但只要没有强引用指向它,就可能被垃圾收集器回收。
  • 通常用于构建对象注册表或管理器。

弱引用是Java中的一种引用类型,当对象只被弱引用引用时,垃圾收集器会在下一次垃圾回收时回收该对象。以下是一个验证弱引用的示例代码:

public class WeakReferenceExample {
    public static void main(String[] args) {
        // 创建一个字符串对象,并将其放入弱引用中
        String str = new String("这是一个弱引用示例");
        WeakReference<String> weakRef = new WeakReference<>(str);

        // 清空强引用,使字符串对象只被弱引用引用
        str = null;

        // 从弱引用中获取对象
        String retrieved = weakRef.get();

        // 打印从弱引用中获取的对象
        System.out.println("从弱引用中获取的对象:" + retrieved);

        // 模拟垃圾回收过程
        System.gc();

        // 等待一段时间以确保垃圾回收器完成回收
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 从弱引用中再次获取对象
        retrieved = weakRef.get();

        // 如果对象被回收,retrieved将为null
        if (retrieved == null) {
            System.out.println("对象已被回收");
        } else {
            System.out.println("对象仍然可用:" + retrieved);
        }
    }
}

运行上面程序,结果如下
在这里插入图片描述
在这个示例中,我们首先创建一个字符串对象,并将其放入弱引用中。然后,我们清空了强引用,使字符串对象只能被弱引用引用。接下来,我们获取弱引用中的对象,并打印出来。然后,我们模拟垃圾回收过程,并等待一段时间以确保垃圾回收器完成回收。最后,我们再次从弱引用中获取对象,并检查对象是否被回收。

运行示例代码后,你会看到当垃圾回收器执行后,弱引用中的对象被回收,因此再次从弱引用中获取的对象为null。这演示了弱引用的行为,它允许对象在没有强引用的情况下被垃圾收集。

四、虚引用

  • 虚引用是最弱的引用类型。
  • 它几乎不影响对象的生命周期,但允许在对象被回收前执行某些操作。
  • 通常与引用队列(ReferenceQueue)一起使用。
public class PhantomReferenceExample {
    public static void main(String[] args) {
        // 创建一个字符串对象,并将其放入虚引用中
        String str = new String("这是一个虚引用示例");
        ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
        PhantomReference<String> phantomRef = new PhantomReference<>(str, referenceQueue);

        // 清空强引用,使字符串对象只被虚引用引用
        str = null;

        // 从虚引用中获取对象
        String retrieved = phantomRef.get();

        // 获取虚引用的引用队列
        PhantomReference<String> before = (PhantomReference<String>) referenceQueue.poll();

        // 打印虚引用中的对象和引用队列
        System.out.println("从虚引用中获取的对象:" + retrieved);
        System.out.println("虚引用的引用队列:" + before);

        // 模拟垃圾回收过程
        System.gc();

        // 等待一段时间以确保垃圾回收器完成回收
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 检查引用队列,查看是否有虚引用对象被放入队列中
        PhantomReference<String> removedRef = (PhantomReference<String>) referenceQueue.poll();
        if (removedRef != null) {
            System.out.println("虚引用对象已被放入引用队列中");
            System.out.println("虚引用的引用队列:" + removedRef);
        } else {
            System.out.println("虚引用对象未被放入引用队列中");
        }
    }
}

运行上面程序,结果如下
在这里插入图片描述
在这个示例中,我们首先创建一个字符串对象,并将其放入虚引用中。然后,我们清空了强引用,使字符串对象只能被虚引用引用。接下来,我们获取虚引用中的对象,获取虚引用的引用队列,并模拟垃圾回收过程。最后,我们检查引用队列,查看是否有虚引用对象被放入队列中。

运行示例代码后,你会看到虚引用对象不可用(retrieved为null),并且虚引用对象已经被垃圾回收器回收并放入引用队列中。这演示了虚引用的行为,可以用于执行某些操作,例如清理相关资源,当对象被回收时。

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

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

相关文章

深度学习-经典网络解析-VGG-[北邮鲁鹏]

这里写目录标题 VGG参考VGG网络贡献使用尺寸更小的 3 3 3 \times 3 33卷积串联来获得更大的感受野放弃使用 11 11 11 \times 11 1111和 5 5 5 \times 5 55这样的大尺寸卷积核深度更深、非线性更强&#xff0c;网络的参数也更少&#xff1b;去掉了AlexNet中的局部响应归一化层…

大模型赛道如何实现华丽的弯道超车【赠书活动|第十期《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》】

文章目录 01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率&#xff0c;降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 通过分布式缓存实现数据本地性03 优化整个工作流的数据共享04 通…

【Java实战项目】【超详细过程】—— 大饼的图片服务器

目录 一.下载前端模板二. 展示图片&#xff08;index.htmll&#xff09;1. 标题2. 页面跳转链接3. 图片展示引入js和vue依赖&#xff1a;写在html文件的head中js代码&#xff1a;写在html文件中的body中html代码&#xff1a;写在html文件的body中 二. 删除图片在上面的vue对象a…

【OWASP如何导出测试报告】

为什么我的OWASP无法导出报告&#xff1f;明明已经扫描完成了

【Linux从入门到精通】多线程 | 线程介绍线程控制

本篇文章主要对线程的概念和线程的控制进行了讲解。其中我们再次对进程概念理解。同时对比了进程和线程的区别。希望本篇文章会对你有所帮助。 文章目录 一、线程概念 1、1 什么是线程 1、2 再次理解进程概念 1、3 轻量级进程 二、进程控制 2、1 创建线程 pthread_create 2、2…

Postgresql与执行计划相关的配置项

1. ENABLE_*参数 在PostgreSQL中有一些以“ENABLE_”开头的参数&#xff0c;这些参数提供了影响查询优化器选择不同执行计划的方法。有时&#xff0c;如果优化器为特定查询选择的执行计划并不是最优的&#xff0c;可以设置这些参数强制优化器选择一个更好的执行计划来临时解决这…

java开发之个微朋友圈机器人的开发

简要描述&#xff1a; 取消点赞 请求URL&#xff1a; http://域名地址/snsCancelPraise 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

分子对接简介-2023

分子对接简介-2023 分子对接&#xff08;Molecular Docking&#xff09;是分子模拟的重要方法之一&#xff0c;其本质是两个或多个分子之间的识别过程&#xff0c;其过程涉及分子之间的空间匹配和能量匹配。这项技术在药物研发、生物医学研究和药物设计中具有广泛的应用&#…

简明 SQL 组合查询指南:掌握 UNION 实现数据筛选

在SQL中&#xff0c;组合查询是一种将多个SELECT查询结果合并的操作&#xff0c;通常使用UNION和UNION ALL两种方式。 UNION 用于合并多个查询结果集&#xff0c;同时去除重复的行&#xff0c;即只保留一份相同的数据。UNION ALL 也用于合并多个查询结果集&#xff0c;但不去除…

MapRdeuce工作原理

hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map&#xff1a; Reduce

腾讯mini项目-【指标监控服务重构】2023-07-27

今日已办 SigNoz Log Management SigNoz原生支持 OpenTelemetry 来收集日志&#xff0c;SigNoz 在收集器端进行了优化&#xff0c;为SigNoz中的日志添加了不同的功能。 OpenTelemetry 提供了各种接收器和处理器&#xff0c;用于直接通过 OpenTelemetry Collector 或通过 Flue…

Everything+cpolar内网穿透轻松实现公网远程访问本地硬盘文件

公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件3. 设定http服务器端口4. 进入cpolar的设置5. 生成公网连到本地内网穿透数据隧道 总结 前言 随着云概念的流行&#xff0c;不少企业采用云存储技术来保…

建筑模板的抗震性能如何评估和测试?

评估和测试建筑模板的抗震性能通常涉及以下几个方面&#xff1a; 1. 材料测试&#xff1a;首先&#xff0c;需要对建筑模板所使用的材料进行力学性能测试。这包括测量材料的抗弯强度、抗压强度、剪切强度等参数。这些测试可以通过标准化的实验方法进行&#xff0c;例如使用万能…

Gavin Wood 演讲全文:建设更具韧性以应变化的 Polkadot

我们非常激动能邀请到 Gavin Wood 博士来现场分享关于 Polkadot 的近况以及最新的进展&#xff0c;带来他对于《加密项目应该怎样应对当今世界的变化》的演讲分享。 &#x1f6a9;点击视频链接观看演讲实录&#xff1a;https://www.youtube.com/watch?vYw3mQNJ5UJQ&t1048s…

数据驱动的仿真

数据驱动的仿真 数据驱动的仿真&#xff08;1&#xff09;动态状态估算。&#xff08;2&#xff09;在线模型调整。&#xff08;3&#xff09;动态事件重构。 数据驱动的仿真 数字孪生体之所以与传统仿真不同&#xff0c;是因为它产生之初就是数据驱动的。早在1979年&#xff…

10英寸及以上占比超7成!车载大屏保持高增速,哪些供应商在领跑?

中控大屏「上车」继续保持高增速态势。 高工智能汽车研究院监测数据显示&#xff0c;今年1-7月中国市场&#xff08;不含进出口&#xff09;乘用车前装标配搭载10英寸及以上大屏&#xff08;含多联屏&#xff09;交付775.16万辆&#xff0c;同比去年同期增长38.19%。 同时&am…

生信分析Python实战练习 7 | 视频24

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

Docker部署Canal监听MySQL binlog

文章目录 概念简述binlogCanal MySQL配置Canal配置创建挂载目录设置权限创建MySQl的Canal账户拉取镜像运行容器简单运行配置文件复制到宿主机修改配置文件删除之前运行的canal容器正式运行Canal容器 查看运行状态排查问题 概念简述 binlog MySQL的二进制日志binlog可以说是My…

支持向量机(SVM)案例分析

支持向量机&#xff08;support vector machines, SVM&#xff09;是一种二分类模型&#xff0c;所谓二分类模型是指比如有很多特征&#xff08;自变量X&#xff09;对另外一个标签项&#xff08;因变量Y&#xff09;的分类作用关系&#xff0c;比如当前有很多特征&#xff0c;…

MySQL 解决数据重复添加

1. sql语句: insert ignore into insert ignore into 表名 (xx1,xx2,xx3) VALUES (#{xx1},#{xx2},#{xx3}) 2. 复合索引