百日筑基第三十四天-JAVA中的强/软/弱/虚引用
百日筑基第三十四天-JAVA中的强/软/弱/虚引用
Java对象的引用被划分为4种级别,分别为强引用、软引用、弱引用以及虚引用。帮助程序更加灵活地控制对象的生命周期和JVM进行垃圾回收。
强引用
强引用是最普遍的引用,一般把一个对象赋给一个引用变量,这个引用变量就是强引用。这个引用保存在Java栈中,而真正的引用内容保存在Java堆中。
// 强引用
Object obj=new Object();
如果使用了强引用,垃圾回收器GC时不会回收该对象,**当空间不足时,JVM宁愿抛出OutOfMemoryError异常。**因为JVM认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。如果想GC时回收该对象,让其超出对象的生命周期范围或者设置引用指向null,并且会执行对象的`finalize 函数。如下:帮助垃圾回收期回收此对象,具体什么时候收集这要取决于GC算法。
obj = null;
举个例子: StrongRefenenceDemo中尽管o1已经被回收,但是o2强引用 o1,一直存在,所以不会被GC回收。
public class StrongRefenenceDemo {public static void main(String[] args) {Object o1 = new Object();Object o2 = o1;o1 = null;System.gc(); // 其实就算我们显示调用,GC 也可能不会立即执行System.out.println(o1); //nullSystem.out.println(o2); //java.lang.Object@4534fdg7}
}
软引用
对象处在有用但非必须的状态,只有当内存空间不足时,GC会回收该引用对象的内存。可以用来实现高速缓存,比如网页缓存、图片缓存等。需要通过SoftReference类来实现。
// 注意:sr引用也是强引用,它是指向SoftReference这个对象的,
// 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T
SoftReference<String> sr = new SoftReference<String>(new String("str"));
软引用可以和一个引用队列ReferenceQueue联合使用,如果软引用所引用对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
ReferenceQueue<Object> queue = new ReferenceQueue<>();
Object obj = new Object();
SoftReference softRef = new SoftReference<Object>(obj,queue);//删除强引用
obj = null;//调用gc
System.gc();
System.out.println("gc之后的值: " + softRef.get()); // 对象依然存在
//申请较大内存使内存空间使用率达到阈值,强迫gc
byte[] bytes = new byte[100 * 1024 * 1024];//如果obj被回收,则软引用会进入引用队列
Reference<?> reference = queue.remove();
if (reference != null){System.out.println("对象已被回收: "+ reference.get()); //
案例一: SpringBoot源码中大量使用ConcurrentReferenceHashMap合理的使用内存,间接的优化JVM,提高垃圾回收效率。
public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V> {private static final ConcurrentReferenceHashMap.ReferenceType DEFAULT_REFERENCE_TYPE;static {DEFAULT_REFERENCE_TYPE = ConcurrentReferenceHashMap.ReferenceType.SOFT;}......
}
SpringFactoriesLoad源码:Springboot SPI机制的主角
public final class SpringFactoriesLoader {private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap();......private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);if (result != null) {return result;} else {try {Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");LinkedMultiValueMap result = new LinkedMultiValueMap();while(urls.hasMoreElements()) {......}cache.put(classLoader, result);return result;} catch (IOException var13) {throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);}}}
AnnotationsScanner自动配置过程中的注解扫描
abstract class AnnotationsScanner {private static final Map<AnnotatedElement, Annotation[]> declaredAnnotationCache = new ConcurrentReferenceHashMap(256);private static final Map<Class<?>, Method[]> baseTypeMethodsCache = new ConcurrentReferenceHashMap(256);
ThreadPoolTaskExecutor 异步任务线程池
public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor {public ThreadPoolTaskExecutor() {this.decoratedTaskMap = new ConcurrentReferenceHashMap(16, ReferenceType.WEAK);}
案例二: Mybatis缓存类SoftCache用到的软引用:
public Object getObject(Object key) {Object result = null;SoftReference<Object> softReference = (SoftReference)this.delegate.getObject(key);if (softReference != null) {result = softReference.get();if (result == null) {this.delegate.removeObject(key);} else {synchronized(this.hardLinksToAvoidGarbageCollection) {this.hardLinksToAvoidGarbageCollection.addFirst(result);if (this.hardLinksToAvoidGarbageCollection.size() > this.numberOfHardLinks) {this.hardLinksToAvoidGarbageCollection.removeLast();}}}}return result;}
弱引用
弱引用就是只要JVM垃圾回收器发现了它,不管内存是否足够,都会被回收。
Object object= new Object();
WeakReference<Object> weakReference= new WeakReference<>(object);
Object result = weakReference.get();
案例: WeakHashMap当key只有弱引用时,GC发现后会自动清理键和值,作为简单的缓存表解决方案。
public class WeakHashMapDemo {public static void main(String[] args) throws InterruptedException {myHashMap();myWeakHashMap();}public static void myHashMap() {HashMap<String, String> map = new HashMap<String, String>();String key = new String("k1");String value = "v1";map.put(key, value);System.out.println(map);key = null;System.gc();System.out.println(map);}public static void myWeakHashMap() throws InterruptedException {WeakHashMap<String, String> map = new WeakHashMap<String, String>();String key = new String("weak");String value = "map";map.put(key, value);System.out.println(map);//去掉强引用key = null;System.gc();Thread.sleep(1000);System.out.println(map);}
}
ThreadLocal: ThreadLocal.ThreadLocalMap.Entry继承了弱引用,key为当前线程实例,和WeakHashMap基本相同。
static class ThreadLocalMap {static class Entry extends WeakReference<ThreadLocal<?>> {Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}//......}
虚引用
虚引用和没有引用是一样的,需要和队列ReferenceQueue联合使用。**当jvm扫描到虚引用的对象时,会先将此对象放入关联的队列中,因此我们可以通过判断队列中是否存这个对象,来进行回收前的一些处理。**有哨兵的作用。
Object object= new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(object, queue);
相关文章:
百日筑基第三十四天-JAVA中的强/软/弱/虚引用
百日筑基第三十四天-JAVA中的强/软/弱/虚引用 Java对象的引用被划分为4种级别,分别为强引用、软引用、弱引用以及虚引用。帮助程序更加灵活地控制对象的生命周期和JVM进行垃圾回收。 强引用 强引用是最普遍的引用,一般把一个对象赋给一个引用变量&…...
C语言100基础拔高题(3)
1.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 解题思路:通过反复调用一个打印最后一个元素的函数,来实现此功能。源代码如下: #include<stdio.h> void oposize(char str[], int len); int main() {//利…...
AV1技术学习:Constrained Directional Enhancement Filter
CDEF允许编解码器沿某些(可能是倾斜的)方向应用非线性消阶滤波器。它以88为单位进行。如下图所示,通过旋转和反射所示的三个模板来定义八个预设方向。 Templates of preset directions and their associated directions. The templates correspond to directions of…...
C++的STL简介(一)
目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类? 4.2string常见接口 4.2.1默认构造 编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…...
DNS劫持
目录 一、DNS的基本概念 二、DNS劫持的工作原理 三、DNS劫持的影响 四、DNS劫持的防范措施 DNS劫持:一种网络安全威胁的深入分析 在当今网络日益发达的时代,互联网已经成为了人们日常生活中不可或缺的一部分。然而,随着网络技术的进步&am…...
Centos7解决网关ens33的静态地址配置
原因复现: 我登录一段时间之后我ens33的网关ip地址发生了改变 原ip地址配置 现有地址: 根据文心一言提示 修改配置文件 sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33 我的原配置 [rootlocalhost ~]# sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"…...
python中常用于构建cnn的库有哪些
在Python中,有多种库可用于构建卷积神经网络(CNN)。以下是几种常用的库: 1. TensorFlow TensorFlow是一个开源深度学习框架,由Google Brain团队开发。它支持构建和训练各种神经网络模型,包括卷积神经网络。…...
【前端 17】使用Axios发送异步请求
Axios 简介与使用:简化 HTTP 请求 在现代 web 开发中,发送 HTTP 请求是一项常见且核心的任务。Axios 是一个基于 Promise 的 HTTP 客户端,适用于 node.js 和浏览器,它提供了一种简单的方法来发送各种 HTTP 请求。本文将介绍 Axio…...
Unity Android接入SDK 遇到的问题
1. buildtools、platformtools、commandline tools 以及compiled sdk version、buildtools sdk version、target sdk version 的说明 Android targetSdkVersion了解一下 - 简书 2. 查看.class 和.jar文件 jd_gui 官网地址: 下载jd_gui 工具 ,或者 idea 下…...
基于深度学习的复杂策略学习
基于深度学习的复杂策略学习(Complex Strategy Learning)是通过深度学习技术,特别是强化学习和模仿学习,来开发和优化解决复杂任务的策略。这类技术广泛应用于自动驾驶、游戏AI、机器人控制和金融交易等领域。以下是对这一领域的系…...
【Golang 面试 - 进阶题】每日 3 题(一)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
周报 Week 3:
补题链接: Week 3 DAY 1-CSDN博客 河南萌新联赛2024第(二)场:南阳理工学院-CSDN博客 Week 3 DAY 5:-CSDN博客 Week 3 DAY 6-CSDN博客 这周题单是动态规划——(背包问题,线性dp):…...
开源消息队列比较
目录 1. Apache Kafka 1.1安装步骤 1.1.1使用Docker安装 1.1.1手动安装 1.2 C#使用示例代码 1.2.1 安装Confluent.Kafka 1.2.2生产者代码示例 1.2.3消费者代码示例 1.3特点 1.4使用场景 2. RabbitMQ 2.1安装步骤 2.1.1使用Docker安装 2.1.2手动安装 2.2 C#使用示…...
【前端逆向】最佳JS反编译利器,原来就是chrome!
有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么,有没有重复加载?此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件,某某Beautify等等。但这些插件看人品,运气不好搞的话,反…...
微信小程序根据动态权限展示tabbar
微信小程序自定义 TabBar 后根据权限动态展示tabbar 在微信小程序开发中,自定义 TabBar 可以让应用更具灵活性和个性化。特别是在用户根据不同权限展示不同的 TabBar 内容时,正确的实现方法能够提升用户体验。本篇文章将分享如何使用事件总线实现权限变动时动态更新自定义 T…...
开源安全信息和事件管理(SIEM)平台OSSIM
简介 OSSIM,开源安全信息和事件管理(SIEM)产品,提供了经过验证的核心SIEM功能,包括事件收集、标准化和关联。 OSSIM作为一个开源平台,具有灵活性和可定制性高的优点,允许用户根据自己的特定需…...
【DP】01背包
算法-01背包 前置知识 DP 思路 01背包一般分为两种,不妨叫做价值01背包和判断01背包。 价值01背包 01背包问题是这样的一类问题:给定一个背包的容量 m m m 和 n n n 个物品,每个物品有重量 w w w 和价值 v v v,求不超过背…...
50、PHP 实现选择排序
题目: PHP 实现选择排序 描述: n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:(1)初始状态:无序区为R[1…n],有序区为空。(2)第1趟排序在无序区R[1…n]中选出关键字最小的记录R[k],将…...
17.延迟队列
介绍 延迟队列,队列内部是有序的,延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中,消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺,如果十天内没…...
KCache-go本地缓存,支持本地缓存过期、缓存过期自维护机制。
GitHub - kocor01/kcache: go 本地缓存解决方案,支持本地缓存过期、缓存过期自维护机制。 最近系统并发很高,单接口10W的 QPS,对 redis 压力很大,大量的热KEY导致 redis 分片CPU资源经常告警。计划用 go 本地缓存缓解 redis 的压…...
【法学研究效率革命】:NotebookLM如何将文献综述时间压缩73%?(20年法律AI实践者亲测)
更多请点击: https://codechina.net 第一章:NotebookLM法学研究辅助 NotebookLM 是 Google 推出的基于用户自有文档构建的 AI 助手,其核心能力在于对上传文本进行深度语义理解与上下文感知问答。在法学研究场景中,它可高效处理判…...
在Nodejs后端服务中集成多模型API实现智能客服
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Nodejs后端服务中集成多模型API实现智能客服 构建一个智能客服系统时,开发者常常面临模型选择的两难:既要…...
用C++和Eigen库手把手实现UR3机械臂逆解(附完整代码与避坑指南)
从理论到实践:基于Eigen库的UR3机械臂逆运动学完整实现指南 在工业自动化和机器人研究领域,六轴协作机械臂因其灵活性和广泛的应用场景而备受关注。UR3作为Universal Robots旗下的紧凑型协作机械臂,凭借其轻量化设计和用户友好特性࿰…...
Linux环境变量与env命令:从核心原理到高级实战应用
1. 项目概述:为什么环境变量是Linux的“隐形指挥棒”在Linux世界里,我们每天都在和各种命令、程序打交道。你有没有想过,为什么ls命令在任何目录下都能直接运行?为什么python命令启动的是Python 3而不是Python 2?又或者…...
独立开发者如何利用 Taotoken 统一管理多个 AI 项目支出
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用 Taotoken 统一管理多个 AI 项目支出 对于同时维护多个小型 AI 应用或实验项目的独立开发者而言,成…...
点式玻璃幕墙及采光顶设计的一些想法
点式玻璃幕墙及采光顶设计的一些想法 点式玻璃幕墙是在主龙骨上面固定点支撑装置,由点支撑装置支撑玻璃面板的一种常用幕墙表现形式,他最早起源于国外。因为玻璃的通透性,建筑内外有效融合,空间感增强,开阔了视野,增加了建筑物的现代感。 点式玻璃幕墙最主要的组成部分是…...
HPM6750 CAN FD实战:从波特率配置到高效收发,避坑指南
1. 项目概述:从经典CAN到CAN FD的实战入门作为一名长期在嵌入式领域摸爬滚打的开发者,我深知现场总线技术,尤其是CAN总线,在工业控制、汽车电子等领域的核心地位。随着数据吞吐量需求的激增,经典CAN的1Mbps带宽逐渐捉襟…...
3分钟彻底移除Windows Defender:释放30%系统性能的实战指南
3分钟彻底移除Windows Defender:释放30%系统性能的实战指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirror…...
机器学习40讲-总结课:机器学习的模型体系
用17讲的篇幅,我和你分享了目前机器学习中的大多数主流模型。可是除开了解了各自的原理,这些模型背后的共性规律在哪里,这些规律又将如何指导对于新模型的理解呢?这就是今天这篇总结的主题。 要想在纷繁复杂的模型万花筒中梳理出一条清晰的脉络,还是要回到最原始的出发点…...
[2026实战] 工程图纸气泡图 (balloon drawing) 标注规范与数字化检验计划生成…
在 2026 年的精密制造与质量管理领域,高效处理气泡图 (balloon drawing) 已成为提升 FAI(首件检查)和 PPAP(生产件批准程序)效率的核心课题。面对日益复杂的工程图纸,传统的机械式手动标注已难以满足智能制…...
