为什么 ThreadLocalMap 的 key 是弱引用 value是强引用

问题一:为什么 ThreadLocalMap 的 key 是弱引用?
【假设 Entry 的 key 是对 ThreadLocal 对象的强引用】:这个 Entry 又持有 ThreadLocal 对象和 value 对象的强引用。如果在其他地方都没有对这个 ThreadLocla 对象的引用了、然后在使用 ThreadLocalMap 的过程中又没有正确地在用完后就调用 remove 方法、所以这个 ThreadLocal 对象和所关联的 value 对象就会跟随着线程一直存在、这样就会可能会造成内存泄漏问题。
特别是在使用线程池的时候、核心线程是会一直存在直到程序结束、如果这些线程中的 ThreadLocalMap 中的数据没有被及时清理、就会一直占用内存、而且在线程复用时可能会导致数据错乱的危险。
【Entry 的 key 是对 ThreadLocal 对象的弱引用】:弱引用就意味着、如果没有其他引用对象的强引用关系、那么这个仅被弱引用引用着的对象在下次 GC 时就会被回收掉、这样在一定程度上降低内存泄漏的风险。但同时也引入了新的问题、key 虽然被回收了、但是 value 对象还在、我们无法获取、也无法删除、这样也会存在内存泄漏的风险。
虽然 ThreadLocalMap 中在进行 set 和 get 操作时会进行启发式清理和探测式清理、清理一部分 key 为 null 的 Entry 对象、但是这也只是一种后备选择方案
最重要的还是开发人员在编写代码时记得在使用完数据后及时调用 remove() 方法手动清理
补充:
【内存泄漏就是:有些对象已经不再使用了、但是由于没有正确处理对象的引用关系、使得这个无用的对象还一直被 GC Root 直接或间接引用着、垃圾回收时就无法清理掉这些对象、如果这类对象存在很多、就会导致内存泄漏。简单地说就是有些无用对象占用着宝贵的内存空间、但又没办法清理掉它们 可达性分析是现代垃圾回收器用来判断对象是否存活的核心算法】
问题二:为什么 ThreadLocalMap 的 value 是强引用?
【假设Entry 的 value 是弱引用】:假设 key 所引用的 ThreadLocal 对象还被其他的引用对象强引用着,那么这个 ThreadLocal 对象就不会被 GC 回收、但如果 value 是弱引用且不被其他引用对象引用着、那 GC 的时候就被回收掉了、那线程通过 ThreadLocal 来获取 value 的时候就会获得 null,显然这不是我们希望的结果。因为对我们来说、value 才是我们想要保存的数据、ThreadLcoal 只是用来关联 value 的、如果 value 都没了、还要 ThreadLocal 干啥呢
面试参考回答:
面试官您好关于 ThreadLocalMap 的 key 使用弱引用、value 使用强引用的问题
我的理解是这样的:
首先要理解这样设计的目的是为了尽可能地避免内存泄漏。
-
Key 使用弱引用: 假设 key 是强引用、那么即使 ThreadLocal 对象本身已经没有其他地方引用了、由于 ThreadLocalMap 中 Entry 的强引用、这个 ThreadLocal 对象仍然无法被垃圾回收。如果线程一直存活(比如线程池中的线程)、这个 ThreadLocal 对象和对应的 value 就会一直占用内存、造成内存泄漏。使用弱引用、当 ThreadLocal 对象没有外部强引用时、在下次 GC 的时候、key 就会被回收、降低了内存泄漏的风险。
-
Value 使用强引用: Value 是我们真正想要存储的数据,如果 value 也使用弱引用、那么在 ThreadLocal 对象还存活的情况下、
value却可能因为没有强引用而被 GC 回收、导致我们通过 ThreadLocal 获取到的 value 为空、这显然是不符合ThreadLocal的设计目的的。ThreadLocal 的作用就是关联数据、如果数据都没了ThreadLocal 就失去了意义。
而且虽然 key 使用弱引用可以降低内存泄漏的风险、但仍然存在 value 无法回收的问题。
当 key 被回收后value 仍然被 Entry 强引用。如果线程一直存活、这个 value 就会一直占用内存。
因此ThreadLocalMap 在 set() 和 get() 操作时会进行启发式清理、移除 key 为 null 的 Entry 但这只是一个补救措施。
最根本的解决办法还是需要开发者在使用完 ThreadLocal 后、手动调用 remove() 方法、及时清理 ThreadLocalMap 中的 Entry,避免内存泄漏。
总结: 弱引用 key 降低了 ThreadLocal 对象本身的内存泄漏风险、强引用 value 保证了数据的可用性。
但最终避免内存泄漏、需要开发者养成良好的习惯、及时清理 ThreadLocal。
相关文章:
为什么 ThreadLocalMap 的 key 是弱引用 value是强引用
问题一:为什么 ThreadLocalMap 的 key 是弱引用? 【假设 Entry 的 key 是对 ThreadLocal 对象的强引用】:这个 Entry 又持有 ThreadLocal 对象和 value 对象的强引用。如果在其他地方都没有对这个 ThreadLocla 对象的引用了、然后在使用 Thr…...
AI 能解开内容的「不可能三角」吗?
3月21日,以“‘AI商业’进化论”为主题的行业峰会在中欧国际工商学院上海校区成功举行,并发布人工智能与商业创新白皮书。本次活动由中欧国际工商学院与特赞科技Tezign联合主办,中欧特赞人工智能与商业创新研究基金承办,中欧AI与营…...
计算机网络 OSI参考模型
目录 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层...
探索新一代大模型代理(LLM agent)及其架构
在人工智能大模型(AI)的浪潮中,2023年我们见证了检索增强生成(Retrieval Augmented Generation, RAG)的兴起,而2024年则无疑成为了“代理”agent的元年。各大AI企业纷纷投身于聊天机器人代理的研发中,工具如MultiOn通过与外部网站的连接实现了…...
AI应用案例(1)——智能工牌和会话质检
今天开辟一个新的模块,自己平时也搜集一些典型的行业应用案例,不如就记录到C站,同时和大家也是个分享好了。 今天分享的企业和产品,是循环智能的智能工牌。 这个产品应用场景清晰,针对的行业痛点合理,解决…...
操作系统高频(五)linux命令
操作系统高频(五)linux命令 1.Linux中查看进程运行状态的指令、tar解压文件的参数。⭐⭐⭐ 在Linux中,可以使用以下指令查看进程的运行状态: top: 用于实时监视系统的进程活动和系统资源使用情况。在终端中运行top…...
HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式
HMTLJSCSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式(可以穿墙死不了,从左边进去可以从右边出来),显示当前分数和最高分,吃到的球颜色可以叠加到蛇身体上 为了适配手机端…...
内网渗透——红日靶场二
目录 一、前期准备 DC机配置 PC机配置 WEB机配置 将PC机和WEB机的IP地址进行更改 开启WEB服务 二、外网探测 1.使用nmap扫描 2.目录扫描 3.漏洞扫描 (1)CVE-2017-3506(getshell失败) (2)CVE-201…...
【Unity】处理文字显示不全的问题
1.选中字体文件,检查 MultiAtlasTeextures 是否勾选,未勾选的话,先勾选保存后查看是否显示正常 2.勾选后未正常显示,则在搜索框中输入未显示的文本,确认字体图集是否包含该文本,然后点击Update Atlas Textu…...
深入解析力扣39.组合总和:回溯算法的妙用
题目描述 给定一个无重复元素的数组 candidates 和一个目标值 target,找出 candidates 中所有可以使数字和为 target 的组合。数组中的数字可以被重复使用。 示例: 输入: candidates [2,3,6,7], target 7 输出: [[2,2,3],[7]]代码解析 class Solut…...
汽车诊断开发入门以及OBD检测
一、OBD 概述 定义:OBD 即 On - Board Diagnostics,车载自动诊断系统。它能实时监测车辆各项系统和部件状态,以此帮助诊断故障并预警。设计初衷与发展:最初设计目的是控制汽车尾气排放,确保符合环境标准。随着技术进步…...
Android 中集成 Google 应用内评分
添加依赖 在项目的 build.gradle 文件中添加以下依赖: dependencies {// Java 依赖implementation com.google.android.play:review:2.0.1// Kotlin 依赖implementation com.google.android.play:review-ktx:2.0.1 }创建 ReviewManager 使用 ReviewManagerFactor…...
Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读
摘要:重点在于关联多个任务本质的联系。 不同恢复任务的关联性很重要。 揭示退化现象的内在机理联系很有意义。 多合一的方法能在单一模型中处理多种退化问题,可扩展性较差。 成分导向范式挖掘不同图像退化现象背后的物理规律或特征模式。 成分导向退化重…...
避坑,c#开发人员学习开发app时.NET MAUI和Vue3 选择
经过一段时间学习vue3后才发现作为一个C#背景的开发人员从开发效率、调试便捷性、部署便利性考虑,Visual Studio + .NET MAUI 是更合适的选择,尤其是在跨平台原生应用开发场景中。以下是详细对比分析: 一、开发体验 1. 语言与生态适配 .NET MAUI:基于C#和.NET生态,与你现有…...
java项目挂机自动重启操作指南
前段时间有个伙伴问我,java项目挂机怎么自动重启。。。。。。今天就写一个 .sh脚本来实现应用挂机的自动重启功能 #!/bin/bash # 查询mita的进程个数 countps -ef | grep mita.jar | grep -v "grep" | wc -l # echo $count nowtimedate "%Y-%m-%d %H…...
Vue el-table-column内el-tooltip识别换行符 \n
结构: <el-table-column prop"callSummary" width"300" label"摘要"><template slot-scope"scope"><el-tooltip class"item" effect"dark" placement"top"><div v-ht…...
【C++指南】一文总结C++二叉搜索树
🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C二叉搜索树的实现。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给…...
【报告】内镜视频图像分析Foundation Model
来源:医疗基础模型 仅供个人学习,侵权请联系我删除...
使用HTML5和CSS3实现炫酷的3D立方体动画
使用HTML5和CSS3实现炫酷的3D立方体动画 项目介绍 本文将详细介绍如何使用HTML5和CSS3技术实现一个交互式3D立方体动画。这个项目不仅展示了现代Web前端技术的强大功能,还能帮助读者深入理解CSS3的3D变换和动画特性。 技术栈 HTML5CSS3 (transform-style, persp…...
【春招笔试】2025.03.29-美团研发岗
📌 点击直达笔试专栏 👉《大厂笔试突围》 题目一:班级值班安排优化 1️⃣:计算员工值班时间总和 2️⃣:直接比较 n*k 与总和的大小关系 难度:简单 这道题目的核心在于数学模型的简化。通过分析平均分配的本质,我们发现只需直接比较员工数量与时间上限的乘积(n*k)和总…...
MySQL数据库和表的操作之SQL语句
🎯 本文专栏:MySQL深入浅出 🚀 作者主页:小度爱学习 MySQL数据库和表的操作 关系型数据库,都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL:结构化查询语言(Structured Query Language)&…...
多模态大语言模型arxiv论文略读(二)
Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representation Space ➡️ 论文标题:Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representat…...
Windows 图形显示驱动开发-WDDM 2.1 功能(一)
WDDM 2.1 要求表 功能 适用性 供应和回收改进必需视频内存管理可选硬件保护内容的可靠性改进选择硬件支持 Windows GameDVR 的应用程序 必需 间接显示选择硬件驱动程序存储和并行安装必需适用于摄像头/捕获场景的 DirectX 内存图面共享必需 WDDM 2.1 支持以下 D3D 版本&#…...
全局曝光与卷帘曝光
文章目录 曝光方式优点缺点应用场景 为何全局曝光帧率比卷帘曝光方式低 卷帘曝光和全局曝光是CMOS传感器两种常见的曝光模式,以下是二者的对比: 参考:B站优致谱视觉 曝光方式 卷帘曝光:传感器的每一行像素按顺序逐行扫描曝光&…...
【一起来学kubernetes】31、Helm使用详解
一、Helm 简介 Helm 是 Kubernetes 的包管理工具,类比 Linux 中的 yum 或 apt,用于简化应用的打包、部署和版本管理。其核心功能包括: Chart 管理:将 Kubernetes 资源(Deployment、Service 等)打包为可复…...
python 常用的6个爬虫第三方库
Python中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析为树形…...
blender场景导入Unity的流程(个人总结)
处理找不到贴图的问题 blender场景导入Unity遇到的主要问题是贴图找不到。经研究是blender里材质的着色器结构不是贴图-原理化BSDF-输出导致的。目前还没有自动解决方法,总结了一个效率还可以的手动解决流程。 打开后到材质预览,看一下显示没问题&…...
可编辑36页PPT | “新基建”在数字化智慧高速公路中的支撑应用方案智慧高速解决方案智慧交通方案
这份文档是一份关于“新基建”在数字化智慧高速公路中支撑应用方案的PPT内容介绍,它详细阐述了新基建在智慧高速建设中的背景、总体要求和建设内容。从政策背景来看,多个政府部门发布了相关政策文件,推动交通运输基础设施的数字化升级和智慧交…...
Spring 核心技术解析【纯干货版】- XV:Spring 网络模块 Spring-Web 模块精讲
Spring Framework 作为 Java 生态中最流行的企业级开发框架,提供了丰富的模块化支持。其中,Spring Web 模块是支撑 Web 开发的基础组件,无论是传统的 MVC 应用,还是 REST API 及微服务架构,都离不开它的核心能力。 本篇…...
一文解读DeepSeek在保险业的应用
引言 随着人工智能技术的深度渗透,保险行业正经历从传统经验驱动向数据智能驱动的转型。作为国产高性能开源大模型的代表,DeepSeek 凭借其低成本、高推理效率及跨模态处理能力,已成为保险机构突破服务瓶颈、重构业务逻辑的核心工具。截止目前…...
