虚引用

news/2024/12/26 10:33:38/文章来源:https://www.cnblogs.com/wangbiaohistory/p/18632183
当被应用的强引用失去后,强引用关联的这个引用也就是虚引用相关的分配就会被回收

  

以ThreadLocal<T>为例1.进行塞值
public void set(T value) {             Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t);    if (map != null) {                 map.set(this, value);          } else {                           createMap(t, value);           }                                  
}          
2.一开始塞值肯定不存在就得走这个方法
void createMap(Thread t, T firstValue) {                           t.threadLocals = new ThreadLocalMap(this, firstValue);         
}          3.里面这个firstKey就是ThreadThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {            table = new Entry[INITIAL_CAPACITY];                                int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);      table[i] = new Entry(firstKey, firstValue);                         size = 1;                                                           setThreshold(INITIAL_CAPACITY);             
4.构建个Entrytable[i] = new Entry(firstKey, firstValue);      
5.Entry里面长这样,构造参数里面有个super(k)static class Entry extends WeakReference<ThreadLocal<?>> {                  /** The value associated with this ThreadLocal. */                      Object value;                                                           Entry(ThreadLocal<?> k, Object v) {                                     super(k);                                                           value = v;                                                          }                                                                       }        

  

 继续看顶层引用

 默认这个queue是空,先不管它

 一直到最底层

 回头再来说,ThreadLocal的缺点,缺点有个啥来着,叫内存泄露,

 ThreadLocal<String> threadLocal = new ThreadLocal<>();//直接new一个出来,这个是强引用threadLocal.set("111");//塞值之后,把Thread和值放到里面的map里面去
一般情况下,threadLocal 消失后,塞值因为弱引用会被垃圾回收器回收。大并发情况下来不及回收,里面的map里面key引用的值来不及释放,没有及时被垃圾回收器回收,就造成了内存泄漏。

  于是之前讲的InheritableThreadLocal就发挥作用了。

但是据我观察,jdk17之后

虽然弱引用机制没有改变,但是 JDK 17 中内存管理方面的改进间接增强了对ThreadLocal相关内存的控制。
例如,JDK 17 的垃圾回收器(如 ZGC 和 Shenandoah GC)的优化使得内存回收更加高效和及时。 在高并发场景下,这些优化后的垃圾回收器能够更频繁地检查内存中的弱引用对象。
当ThreadLocal对象作为弱引用被回收后,
内存管理系统可以更快地识别并处理对应的ThreadLocalMap中的Entry,减少了无效Entry(键已被回收但值还在)在内存中停留的时间

  

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

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

相关文章

容器环境的MySQL、canal、Elasticsearch数据同步测试

回顾一次容器环境的MySQL、canal、Elasticsearch数据同步 MySQL和Elasticsearch安装初始化就不展示了,版本如下:sql表关键字段如下: CREATE TABLE `fault_code` (`title` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,`description` varchar(512) CHARACTER SET utf8mb…

从全球到本地:跨境电商如何提升供应链管理效率

一、引言 随着全球化的推进与互联网技术的飞速发展,跨境电商已成为全球贸易的重要组成部分。跨境电商平台通过缩短国际贸易的链条,打破了传统贸易壁垒,使消费者能够方便快捷地购买来自世界各地的商品。然而,跨境电商的成功不仅仅依赖于商品的丰富性和价格竞争力,背后更为复…

违规停放智能监测摄像机

违规停放智能监测摄像机结合高清晰度摄像功能和智能识别算法,可以对违规停放行为进行准确识别和监测。这种设备可根据设定的监测区域和参数,自动识别车辆停放位置和停放时间,一旦发现有车辆违停停放,系统将立即发送警报通知相关部门及时处理。通过这种方式,可以及时发现、…

破解跨境电商的竞争难题:高效市场竞争管理的核心要素

一、引言 随着全球化进程的加速和互联网技术的快速发展,跨境电商成为了全球贸易的新兴力量。跨境电商平台通过打破国界和时间的限制,为消费者和商家提供了更便捷、更高效的购物和销售渠道。然而,随着这一市场的逐步成熟,平台之间的竞争愈加激烈,如何在这样的竞争中脱颖而出…

MIT、OpenAI等震撼力作:AI首次自主发现人工生命!人类窥见上帝造物

就在刚刚,由Transformer八子创立的Sakana AI,联合来自MIT、OpenAI、瑞士AI实验室IDSIA等机构的研究人员,提出了「自动搜索人工生命」的新算法!论文地址:https://arxiv.org/abs/2412.17799 言归正传,ALife,即「人工生命」,是一门跨学科研究,旨在通过模拟生命的行为、特…

AI基坑监测识别摄像机

AI基坑监测识别摄像机是一种利用人工智能技术进行基坑监测的智能设备,其作用是监测基坑工程施工过程中的变化,并识别潜在的风险因素,以提供准确数据和及时预警,确保基坑工程的安全进行。这种摄像机通过高清摄像头实时捕捉基坑工程的图像,然后利用AI算法对基坑的土体稳定性…

波士顿矩阵:如何制定产品战略与组合优化?

引言 在当今竞争激烈的市场环境中,企业面临着众多产品的管理与决策难题。如何合理分配资源,确定哪些产品值得加大投入,哪些产品需要逐步淘汰,是企业实现可持续发展的关键。波士顿矩阵作为一种经典的产品战略分析工具,为企业提供了一个清晰的框架,帮助管理者洞察产品的市场…

电动车违停智能监测摄像机

电动车违停智能监测摄像机可以通过合理设置监控区域和参数,实现对电动车违停情况的自动监测和报警。一旦系统检测到电动车违停情况,比如车辆停放时间过长或占用人行道等,会立即发送警报通知相关部门,以便及时处理并维护交通秩序。电动车违停智能监测摄像机可以广泛应用于城…

Flutter进阶组件(2):CheckboxListTile(复选框列表项)

CheckboxListTile是一个特殊的ListTile,它内嵌了一个复选框(Checkbox)。这使得它非常适合用来创建一个带有标题和可选复选框的列表项,常用于设置界面或需要用户选择多个选项的场景。 一、属性 CheckboxListTile组件提供了以下属性,以支持各种自定义需求:title: 显示的标题…

3种常见的数据库迁移工具对比

3种常见的数据库迁移工具对比神州数码云基地​已认证账号​关注2 人赞同了该文章之前在项目中,收到一个紧急需求,要把数据从 PostgreSQL 迁移到 TiDB 中。由于时间紧任务重,来不及调研高效的方式,直接使用了 Navicat 内置的功能,把数据从 PostgreSQL 迁移到了 TiDB。 项…

img标签的onerror事件有什么作用?

onerror 是 HTML <img> 标签的一个事件属性,它用于指定当图像加载出现错误时执行的 JavaScript 代码。如果指定的图像文件不存在、无法访问,或者由于某种原因无法正确加载到页面上,就会触发这个事件。 例如,你可以使用 onerror 事件来提供一个备用的图像,以便在原图…