JVM-Java的四种引用

引用分析

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型

强引用:

被强引用关联的对象不会被回收,只有所有 GCRoots 都不通过强引用引用该对象,才能被垃圾回收

  • 强引用可以直接访问目标对象

  • 虚拟机宁愿抛出 OOM 异常,也不会回收强引用所指向对象

  • 强引用可能导致内存泄漏

Object obj = new Object();//使用 new 一个新对象的方式来创建强引用

软引用(SoftReference):

被软引用关联的对象只有在内存不够的情况下才会被回收

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;  // 使对象只被软引用关联
  • 仅(可能有强引用,一个对象可以被多个引用)有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象

  • 配合引用队列来释放软引用自身,在构造软引用时,可以指定一个引用队列,当软引用对象被回收时,就会加入指定的引用队列,通过这个队列可以跟踪对象的回收情况

  • 软引用通常用来实现内存敏感的缓存,比如高速缓存就有用到软引用;如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时不会耗尽内存

弱引用(WeakReference):

被弱引用关联的对象一定会被回收,只能存活到下一次垃圾回收发生之前,即发生垃圾回收时一定会回收弱引用

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
  • 仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象

  • 配合引用队列来释放弱引用自身

  • WeakHashMap 用来存储图片信息,可以在内存不足的时候及时回收,避免了 OOM

虚引用(PhantomReference):

也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个,引入虚引用主要是为了释放直接内存

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj, null);
obj = null;
  • 一个对象是否有虚引用的存在,不会对其生存时间造成影响,也无法通过虚引用得到一个对象

  • 为对象设置虚引用的唯一目的是在于跟踪垃圾回收过程,能在这个对象被回收时收到一个系统通知

  • 必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存

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

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

相关文章

SQLite 插入数据并返回自增ID

要插入数据并返回自增ID&#xff0c;我们可以使用SQLite的last_insert_rowid()函数。这个函数返回了最后一次插入操作的自增ID。 下面我们通过一个示例来演示如何插入数据并返回自增ID。 首先&#xff0c;创建一个表来存储学生信息&#xff1a; CREATE TABLE students (id I…

【drools】8.44 例子ubuntu24.04 运行;IntelliJ 修复java: 错误: 不支持发行版本 5

首先是要有jdk 安装:这里是oracle的,不是openjdk ,【ubuntu24.04】安装oracle javasdk– 官方说可以直接跑 root@k8s-master-pfsrv:/home/zhangbin/perfwork/drools/drools-distribution-8.44.0.Final/examples# ./runExamples.sh Usage: ./runExamples.sh For example: .…

dubbo:dubbo+nacos整合springcloud gateway实现网关(三)

文章目录 0. 引言1. 集成gateway网关1.1 实操步骤1.2 dubbo提供者注册到nacos出现两个实例的问题 2. 源码3. 总结 0. 引言 上次我们讲到使用zookeeper作为注册中心搭建dubbo微服务框架&#xff0c;但是我们还缺少一个服务总入口&#xff0c;也就是我们的网关服务。所以今天我们…

速盾:cdn能防ip追踪吗?

CDN&#xff0c;即内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种通过网络分布在多个地理位置的服务器集群来提供高效内容传输服务的技术。CDN的主要目的是通过就近提供内容来加快网站的加载速度&#xff0c;并减少因服务器过载而导致的延迟…

DataWhale AI夏令营-《李宏毅深度学习教程》笔记

DataWhale AI夏令营-《李宏毅深度学习教程》笔记 第三章 深度学习基础补充一些基础临界点及其种类逃离临界点方法批量动量自适应学习率学习率调度 之前一直接触的LLM大模型做一些应用&#xff0c;或者传统的自然语言处理&#xff0c;都是直接拿别人的模型用&#xff0c;要不就是…

2024.8.23 刷题总结

2024.8.23 **每日一题** 198.打家劫舍&#xff0c;这道题是一道简单的入门动态规划问题&#xff0c;根据题目意思&#xff0c;我们不能取数组中相邻的元素然后还必须满足总结果最大&#xff0c;所以我们可以维护一个数组&#xff0c;用来保存在数组每个位置之前能取到的最大值&…

【openwrt-21.02】openwrt-21.02 T750 按键GPIO自动进入刷机模式功能实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

k8s 部署Ruoyi-Vue-Plus之vue打包镜像

在这里插入图片描述 在这篇文章中&#xff0c;解释如何通过容器化&#xff08;Docker&#xff09;来打包和部署前端项目&#xff0c;替代之前手动维护版本的方式 1.nginx配置 在 ruoyi-ui 项目的根目录下创建一个 nginx.conf 文件, 我没有使用monitor-admin和xxljob-admin模块…

maven 从特定module(项目)重新开始编译

前言 一般情况下&#xff0c;多module的项目数量过少&#xff0c;可能不需要使用到这个功能&#xff0c;但是当项目过多就很有必要&#xff0c;例如有20个module 编译到最后一个报错了&#xff0c;那重新构建的话 就会从第一个项目再来一遍&#xff0c;是不是很烦躁。 实践 …

语言基础/单向链表的构建和使用(含Linux中SLIST的解析和使用)

文章目录 概述简单的链表描述链表的术语简单实现一个单链表 Linux之SLIST机理分析结构定义单链表初始化单链表插入元素单链表遍历元素单链表删除元素 Linux之SLIST使用实践纯C中typedef重命名带来的问题预留 概述 本文讲述了数据结构中单链表的基本概念&#xff0c;头指针、头…

分发糖果

题目 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧…

前端面试——什么是原型和原型链

背景 最近看到了很有意思的东西&#xff0c;原型和原型链 我们首先看看MDN怎么讲&#xff1a;继承与原型链 - JavaScript | MDN 不过文档里面也没有给出原型的定义&#xff1f;&#xff1f;&#xff1f; 不过里面提到原型链&#xff0c;是指对象层层向上寻找原型形成的路径…

CPP中lamada表达式作用一览[more cpp-6]

一般语法 CPP中的lambda 表达式的本质就是匿名函数&#xff0c;它可以在代码中定义一个临时的、局部的函数.为什么需要lamada表达式&#xff1f; 因为命名是个大问题 想名字以及避免命名冲突是很劳神费力的事&#xff0c;这就是lamada表达式的优点(lamada优点表现为简洁性)总…

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码&#xff0c;您的 Android 移动设备将锁定您。发生这种情况时&#xff0c;通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是&#xff0c;这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

编程学习中的“知识宝库”打造秘籍

编程学习中的“知识宝库”打造秘籍 在编程学习的道路上&#xff0c;我们犹如航海家在知识的海洋中探索前行。而高效的笔记记录和整理方法&#xff0c;无疑就是那张珍贵的航海图&#xff0c;引领我们在浩瀚的编程知识海洋中找到方向。 一、为什么需要一个好的笔记系统 编程知…

Ps:首选项 - 界面

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为&#xff0c;从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率&#xff0c;减轻眼…

单片机外部中断+定时器实现红外遥控NEC协议解码

单片机外部中断定时器实现红外遥控NEC协议解码 概述解码过程参考代码 概述 红外(Infrared&#xff0c;IR)遥控&#xff0c;是一种通过调制红外光实现的无线遥控器&#xff0c;常用于家电设备&#xff1a;电视机、机顶盒等等。NEC协议采用PPM(Pulse Position Modulation&#x…

算法题目杂记

差分 来源 https://www.acwing.com/problem/content/799/ 题目 输入一个长度为 n的整数序列。 接下来输入 m个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加 c。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中&#xff0c;使用 methods 选项定义获取用户信…

实验16:定时器中断实验

无硬件图&#xff0c;用到D1灯 代码main.c #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;sbit LED1P2^0;void delay_10us(u16 n) {while(n--); }void delay_ms(u16 ms) {u16 i,j;for(ims;i>0;i--)for(j110;j>0;j--); }void time0_init(v…