强引用、软引用、弱引用、虚引用用法

强引用、软引用、弱引用、虚引用用法

  • 强引用
  • 弱引用
  • 弱引用
  • 虚引用

强引用

强引用是指程序中在程序代码之中类似“Object obj = new Object()”的引用关系,无论任何情况下,只要强引用关系还存在,垃圾回收器就不会回收掉被引用的对象。
强引用是我们最常用的引用,没什么好讲的,在集合源码中也可以见到将强引用置为null来使对象被回收的操作:

    /*** HashMap中的清除方法,将所有节点遍历置为null* 使不可达对象在下次gc时被回收*/public void clear() {Node<K,V>[] tab;modCount++;if ((tab = table) != null && size > 0) {size = 0;for (int i = 0; i < tab.length; ++i)tab[i] = null;}}

弱引用

在虚拟机抛出OutOfMemoryError之前,所有对软可达对象的软引用都保证已被清除。也就是说在发生内存溢出之前会先清除软引用,并且软引用对象也会被清除。
这样我们就可以利用软引用做一层缓存,在空间充足的时候保存一些文件,在空间紧张时自动清理并且做一些善后操作。


public class test {public static void main(String[] args) {softReferenceOverHeadLimitResolve();}private static void softReferenceOverHeadLimitResolve() {int capacity = 1024 * 1024;//用来保存对象HashSet<SoftReference<SmallSoftObject>> set = new HashSet<>(capacity);// 引用队列,被清除的软引用会进入这个队列中,这个队列我们之后还会再用到ReferenceQueue<SmallSoftObject> referenceQueue = new ReferenceQueue<>();for (int i = 0; i < capacity; i++) {// 保存文件set.add(new SoftReference<>(new SmallSoftObject(), referenceQueue));// 如果之前保存的文件因为空间不足被清理,可以在这个方法里执行善后处理removeObject(set, referenceQueue);}System.out.println("End");}private static void removeObject(HashSet<SoftReference<SmallSoftObject>> set, ReferenceQueue<SmallSoftObject> referenceQueue) {//获得被清理的软引用,在set中删除Reference<? extends SmallSoftObject> poll = referenceQueue.poll();while (poll != null) {set.remove(poll);poll = referenceQueue.poll();}}static class SmallSoftObject {byte[] data = new byte[1024];}
}

现在我们添加运行参数,修改堆大小模拟内存不够的情况,并开启gc日志

-Xmx40m -XX:+PrintGC

在这里插入图片描述
以下是运行结果
在这里插入图片描述

弱引用

弱引用在下次垃圾回收发生时就会被回收。

WeakReference<byte[]> wk = new WeakReference<byte[]>(new byte[1024 * 1024 * 100]);System.out.println(wk.get());System.gc();System.out.println(wk.get());

在这里插入图片描述

虚引用

虚引用被回收后会进入引用队列等待,查看代码发现只有一个带队列的构造方法:
在这里插入图片描述
那么我们使用虚引用的目的就是当对象被回收,虚引用会进入引用队列,这是我们从引用队列取出引用后得知对象被回收的信息,进行验尸工作。

public class test {public static void main(String[] args) {testPhantomReference();}public static void testPhantomReference() {ReferenceQueue rq = new ReferenceQueue();byte[] bytes = new byte[1024 * 1024 * 100];PhantomReference<byte[]> pr = new PhantomReference<byte[]>(bytes, rq);//监控对象是否被清理Thread cleanUpThread = new Thread(() -> {try {while(true){Reference remove = rq.remove();System.out.println("对象被清理了" + remove);}} catch (InterruptedException e) {throw new RuntimeException(e);}});cleanUpThread.setDaemon(true);cleanUpThread.start();bytes = null;System.gc();}

这里我们启动一个守护线程去监控对象是否被清理,如果被清理则打印清理内容
在这里插入图片描述

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

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

相关文章

日期类(Date)的实现 (C++版)

​ &#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C入门 目录 前言 一、Date的头文件&#xff0c;包含函数声明 二、 Date.cpp 2.1 int GetMonthDay(int year, int month) 2.2 bool Check() 2.3 Date& …

【吊打面试官系列-MySQL面试题】什么是基本表?什么是视图?

大家好&#xff0c;我是锋哥。今天分享关于【什么是基本表&#xff1f;什么是视图&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是基本表&#xff1f;什么是视图&#xff1f; 基本表是本身独立存在的表&#xff0c;在 SQL 中一个关系就对应一个表。 视图…

【含开题报告+文档+PPT+源码】闲置二手市场小程序的设计与实现

开题报告 闲置二手市场平台的背景可以追溯到互联网的普及和电子商务的兴起。随着互联网技术的不断发展&#xff0c;人们的消费观念也在不断变化&#xff0c;越来越多的人开始关注二手商品的价值和优势。同时&#xff0c;大用户群体也在不断增加&#xff0c;他们对于经济实惠的…

利用顺序栈输出对应的二进制数,找迷宫出口详解(数据结构作业04)

目录 利用顺序栈输出对应的二进制数 代码&#xff1a; 运行结果&#xff1a; 找迷宫出口 代码&#xff1a; 图解&#xff1a; 运行结果&#xff1a; 利用顺序栈输出对应的二进制数 键盘输入一个十进制正整数89&#xff0c;用C语言设计一个算法&#xff0c;利用顺序栈…

MambaAD 实验部分讲解

4 实验 4.1 设置&#xff1a;数据集、指标和细节 数据集&#xff08;6个&#xff09; 1.MVTec-AD&#xff1a; 包含5种类型的纹理和10种类型的对象&#xff0c;总共5,354张高分辨率图像。 实验&#xff1a; 3,629张正常图像被指定为训练。 剩下的 1,725 张图像被保留用于测试…

网络基础擅长组建乐队

让我们荡起双桨 来说说网络吧 现有计算机要进行协作&#xff0c;网络的产生是必然的 局域网&#xff1a;计算机数量更多了, 通过交换机和路由器连接在一起 广域网&#xff1a;将远隔千里的计算机都连在一起 交换机路由器等设备就应运而生 计算机是人的工具&#xff0c;人要协…

美国游戏发展趋势

美国拥有一些最大、最具影响力的游戏开发工作室&#xff0c;是游戏行业的全球领导者。凭借丰富地创新历史&#xff0c;美国游戏开发不断发展&#xff0c;受到尖端技术、消费者偏好和市场动态的影响。已经出现了几个趋势&#xff0c;这些趋势定义了该国游戏发展的方向&#xff0…

node高版本报错: digital envelope routines::unsupported

node高版本报错&#xff1a; digital envelope routines::unsupported 解决方案&#xff1a; package.json中&#xff0c;启动命令前加上&#xff1a; set NODE_OPTIONS--openssl-legacy-provider &&

WPF 手撸插件 八 操作数据库一

1、本文将使用SqlSugar创建Sqlite数据库&#xff0c;进行入门的增删改查等操作。擦&#xff0c;咋写着写着凌乱起来了。 SqlSugar官方文档&#xff1a;简单示例&#xff0c;1分钟入门 - SqlSugar 5x - .NET果糖网 2、环境SqlSugar V5.0版本需要.Net Framework 4.6 &#xff0…

Qt源码-Qt多媒体音频框架

Qt 多媒体音频框架 一、概述二、音频设计1. ALSA 基础2. Qt 音频类1. 接口实现2. alsa 插件实现 一、概述 环境详细Qt版本Qt 5.15操作系统Deepin v23代码工具Visual Code源码https://github.com/qt/qtmultimedia/tree/5.15 这里记录一下在Linux下Qt 的 Qt Multimedia 模块的设…

Windows 11 version 24H2 LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oct 2024)

Windows 11 version 24H2 & LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oct 2024) Windows 11, version 24H2&#xff0c;企业版 arm64 x64 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/ 查看最新版。原创作品&#xff0c;转载请保留出处。…

20年408数据结构

第一题&#xff1a; 解析&#xff1a;这种题可以先画个草图分析一下&#xff0c;一下就看出来了。 这里的m(7,2)对应的是这图里的m(2,7),第一列存1个元素&#xff0c;第二列存2个元素&#xff0c;第三列存3个元素&#xff0c;第四列存4个元素&#xff0c;第五列存5个元素&#…

C嘎嘎入门篇:类和对象番外(时间类)

前文&#xff1a; 小编在前文讲述了类和对象的一部分内容&#xff0c;其中小编讲述过运算符重载这个概念以及一个时间类&#xff0c;当时小编讲的没有那么细致&#xff0c;下面小编将会讲述时间类来帮助各位读者朋友更好的去理解运算符重载&#xff0c;那么&#xff0c;代码时刻…

江西精装世家新型环保材料有限公司:环保家装理念已深入人心!

在现代社会&#xff0c;随着环保意识的觉醒&#xff0c;越来越多的人开始重视家居环境的健康与可持续性。江西精装世家新型环保材料有限公司&#xff0c;作为家装行业的佼佼者&#xff0c;正是这一绿色潮流的引领者。该公司将环保理念深深融入家装实践之中&#xff0c;为消费者…

奥斯卡影帝阿尔帕西诺自传出版:儿子和女友为他提供了写自传的灵感

女友努尔阿尔法拉&#xff08;Noor Alfallah&#xff09;何许人也&#xff1f; 许多人在听到阿尔帕西诺将在80岁出头再次成为父亲的消息时感到震惊&#xff0c;但一年后&#xff0c;帕西诺已经证明他喜欢再次成为他和努尔阿夫拉的女儿罗曼的父亲&#xff1b;甚至激发了一个即将…

数字电表读数检测图像数据集,数据集总共3300左右张图片,标注为voc格式

数字电表读数检测图像数据集&#xff0c;数据集总共3300左右张图片&#xff0c;标注为voc格式 数字电表读数检测数据集 (Digital Meter Reading Detection Dataset) 数据集概述 该数据集是一个专门用于训练和评估数字电表读数检测模型的数据集。数据集包含约3300张图像&#…

高速机器人的点动与直线运动

工业机器人中的点动和直线运动非常之重要&#xff0c;接下来说一下他们的实现过程。 点动&#xff1a; 点动包括两个部分&#xff0c;第一个点动是每一个关节电机的点动&#xff0c;第二个是机器末端向xyz的三个方向进行点动处理。 第一个点动是非常简单的&#xff0c;即把对…

购物清单 | 双十一加购率最高好物合集,数码购物车必备!

​双十一来临&#xff0c;小伙伴们肯定已经被种草了很多很多清单&#xff0c;开始买买买了&#xff01;但是&#xff0c;作为一个数码博主&#xff0c;怎么能少了数码产品&#xff01;今天我给大家准备了一份数码人专属的购物清单&#xff0c;快来看看吧&#xff01; 运动耳机…

Android阶段学习思维导图

前言 记录下自己做的一个对Android原生应用层的思维导图&#xff0c;方便个人记忆扩展&#xff1b;这里只露出二级标题。 后语 虽然有些内容只是初步了解&#xff0c;但还是记录了下来&#xff1b;算是对过去一段学习的告别。