Threadlocal为何引发内存泄漏问题
首先我们要先了解什么是泄漏问题和什么是内存溢出
内存泄漏表示程序员申请了内存,但是该内存一直无法被释放
内存溢出表示申请内存不足,就会报错
为何引发内存泄漏问题
- 因为每个线程都有自己独立的ThreadLocalMap对象,key为ThreadLocal,value为变量值。Key为ThreadLocal作为Entry对象的key,是弱引用,当ThreadLocal指向null的时候,Entry对象中的key变为null,该对象一直无法被垃圾回收机制回收,一直占用到了系统内存,有可能发生内存泄漏的问题
接下来我来证实这一观点
public class ThreadLocalTest {public static void main(String[] args) {ThreadLocal<String> threadLocal = new ThreadLocal<>();threadLocal.set("donglin");threadLocal = null;Thread thread = Thread.currentThread();System.out.println(thread);}
}
我们进行debug,发现threadlocal里面还有值,并且还有引用

线程中Threadlocal设置为null(也可以理解为该线程方法执行完毕了),会断开主线程和堆内存之间的引用链,当GC回收的时候,不会回收堆内存,因为还有一条指向堆内存的引用链,从而会导致内存泄漏

那如何解决这个ThreadLocalMap引用链呢
使用revome方法
public class ThreadLocalTest {public static void main(String[] args) {ThreadLocal<String> threadLocal = new ThreadLocal<>();threadLocal.set("donglin");//ThreadLocalMap与内存中的ThreadLocal断开引用threadLocal.remove();//threadLocal与堆内存中的ThreadLocal断开引用threadLocal = null;//GCRoot引用链就会发现ThreadLocal,没有人引用,就会清理掉该对象,避免内存泄漏问题Thread thread = Thread.currentThread();System.out.println(thread);}
}
为啥要使用弱引用而不使用强引用
当function01方法执行完毕后,栈帧销毁强引用 tl 也就没有了。但此时线程的ThreadLocalMap里某个entry的key引用还指向这个对象
若这个key引用是强引用,就会导致key指向的ThreadLocal对象及v指向的对象不能被gc回收,造成内存泄漏;
若这个key引用是弱引用就大概率会减少内存泄漏的问题(还有一个key为null的雷)。使用弱引用,就可以使ThreadLocal对象在方法执行完毕后顺利被回收且Entry的key引用指向为null。

此后我们调用get,set或remove方法时,就会尝试删除key为null的entry,可以释放value对象所占用的内存。
相关文章:
Threadlocal为何引发内存泄漏问题
首先我们要先了解什么是泄漏问题和什么是内存溢出 内存泄漏表示程序员申请了内存,但是该内存一直无法被释放 内存溢出表示申请内存不足,就会报错 为何引发内存泄漏问题 因为每个线程都有自己独立的ThreadLocalMap对象,key为ThreadLocal&…...
如何写好 Python 的 Lambda 函数?
当你需要完成一件小工作时,在本地环境中使用这个函数,可以让工作如此得心应手,它就是 Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas,它们的语法如下: lambda arguments: expression…...
大数据技术架构(组件)32——Spark:Spark SQL--Execute Engine
2.2、Spark SQL2.2.1、Execute EngineSparkSql的整体提交执行流程和Hive的执行流程基本上一致。站在通用的角度,对于SparkSql来说,从Sql到Spark的RDD执行需要经历两个大的阶段:逻辑计划和物理计划逻辑计划层面会把用户提交的sql转换成树型结构…...
Leetcode.1138 字母板上的路径
题目链接 Leetcode.1138 字母板上的路径 Rating : 1411 题目描述 我们从一块字母板上的位置 (0, 0)出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board ["abcde", "fghij", "klmno", "pqr…...
一个自动配置 opengrok 多项目的脚本
前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。 我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。 要是再让我手动配置几个项目,估计真要崩溃…...
JAVA同步代码块 同步方法
JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) {// 卖完了break; } else {ticket--;System.out.println(Thread.currentThread().getName() "在卖票,还剩下" ticket "张")…...
分享111个助理类简历模板,总有一款适合您
分享111个助理类简历模板,总有一款适合您 111个助理类简历模板下载链接:https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码:8y54 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…...
Allegro如何更改临时高亮的颜色设置操作指导
Allegro如何更改临时高亮的颜色设置操作指导 在用Allegro做PCB设计的时候,当移动或者高亮某个对象之前,会被临时高亮一个颜色,方便查看,类似下图 运行高亮命令的时候,器件被临时高亮成了白色 软件默认的是白色,如何更改成其它颜色? 具体操作如下 点击Display选择Color…...
知识图谱嵌入技术研究综述
作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…...
Scratch少儿编程案例-水果忍者-超完整
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
练 习
1.判断三个中最重的//依次输入相应的人的体重double people1, people2, people3;cout << "请输入第一个人体重" << endl;cin >> people1;cout << "请输入第二个人体重" << endl;cin >> people2;cout << "请…...
Urho3D整体结构
Urho3D引擎编译成一个库。从概念上讲,它由几个代表不同子系统或功能的“子库”组成。其中每个都位于Source/Urho3D目录下的子目录中: 容器:提供STL替换类和共享指针。数学:提供相交测试中使用的矢量、四元数和矩阵类型以及几何形状。Core:提供执行上下文…...
大数据技术之Hudi
Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&a…...
libxlsxwriter条件格式
今天来看一个libxlsxwriter的高级用法:一个条件格式的示例。 说它“高级”,也是基于非Excel专家的小白们的视角。对,没错,本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题:有一列数据,有…...
nodejs+vue+elementui在线求助系统vscode
目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进…...
电子技术——BJT差分输入对
电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图: 首先我们考虑两端输入共模信号 VCMV_{CM}VCM : 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1vB2VCM 因为电路的对称结构,所以 i…...
[MySQL教程②] - MySQL介绍和发展史
目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些? ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...
多表查询--实例
1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TABLE score ( id INT…...
Differentially Private Grids for Geospatial Data
文章目录abstractintroabstract 在本文中,我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明,基于分区的概要方法的关键挑战在于选择正确的分区粒…...
Java学习记录day8
类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae(B站千峰马剑威Java基础入门视频第P55,记录的重要学习内容之一) final关键字 作用: 声明一个常量&…...
Ostrakon-VL像素特工部署实战:Python入门者的3步环境搭建指南
Ostrakon-VL像素特工部署实战:Python入门者的3步环境搭建指南 1. 为什么选择Ostrakon-VL 如果你刚接触Python又想尝试AI图像处理,Ostrakon-VL是个不错的起点。这个模型特别适合处理图像扫描和基础视觉任务,对硬件要求不高,部署过…...
OpenClaw技能市场巡礼:Phi-3-mini-128k-instruct十大实用插件推荐
OpenClaw技能市场巡礼:Phi-3-mini-128k-instruct十大实用插件推荐 1. 为什么需要技能市场? 当我第一次接触OpenClaw时,最让我惊喜的不是它能操控我的电脑完成各种任务,而是它拥有一个充满活力的技能市场——ClawHub。这个市场就…...
大模型实习备战路线图:从入门到入职
现在95%的大模型实习岗位,都不是让你去从头“创造”一个GPT-5,而是让你基于现有的模型,去做各种“下游”工作。什么意思呢?大家想象中的大模型实习,可能是这样的:一排排A100/H100在你面前闪烁,你…...
公众号流量分成大涨!后公众号时代如何运营?流量商店旗下的互粉平台成增粉利器!
“上个月流量主收入终于突破5000元了!”深夜,运营“职场进化论”公众号的小林在朋友圈晒出后台截图。一年前,这个只有几百粉丝的账号月收入还不到100元。而如今,像小林这样依靠公众号流量分成实现可观收入的创作者正越来越多。 20…...
Wireshark过滤规则、OSI模型与TCP三次握手详解
本文内容有以下三个部分: wireshark过滤规则osi模型简述tcp三次握手 一、wireshark过滤规则 wireshark只是一个抓包工具,用其他抓包工具同样能够分析tcp三次握手协议。例如,Sniffmaster是一款全平台抓包工具,支持HTTPS、TCP和UDP协…...
搜索引擎优化(SEO)对网站排名有什么影响
搜索引擎优化(SEO)对网站排名有什么影响 在当今互联网时代,拥有一个成功的网站不仅仅是建立一个美观的网页,更重要的是让这个网站在搜索引擎中获得高排名。搜索引擎优化(SEO)正是为了解决这个问题,让你的网站能够在大…...
颠覆式闲鱼智能客服系统:家居卖家7×24小时值守零门槛解决方案
颠覆式闲鱼智能客服系统:家居卖家724小时值守零门槛解决方案 【免费下载链接】XianyuAutoAgent 智能闲鱼客服机器人系统:专为闲鱼平台打造的AI值守解决方案,实现闲鱼平台724小时自动化值守,支持多专家协同决策、智能议价和上下文感…...
macOS高效配置:OpenClaw与Qwen3.5-9B镜像深度集成指南
macOS高效配置:OpenClaw与Qwen3.5-9B镜像深度集成指南 1. 为什么选择OpenClaw与Qwen3.5-9B组合 去年冬天,当我第一次尝试用AI自动化处理日常工作报告时,发现大多数云端方案要么功能受限,要么隐私性存疑。直到遇见OpenClaw这个能…...
constexpr从入门到架构级应用:掌握5大编译期元编程模式,3天重构高性能库
第一章:constexpr的本质与编译期计算范式constexpr 不是简单的“编译期可求值”标记,而是一种强制性的**编译期契约**:它要求被修饰的函数或变量必须在编译阶段完成求值,且所有操作必须处于常量表达式语境中。这一机制推动 C 从运…...
B端管理后台原型设计进阶:从8大案例拆解到高效设计策略落地
1. 从案例拆解到设计策略的进阶路径 刚入行做B端设计那会儿,我总以为管理后台就是把功能堆砌在页面上。直到接手第一个供应链系统项目时,看到用户对着满屏按钮手足无措的样子才恍然大悟——好的B端设计不是功能的集装箱,而是业务的翻译官。这…...
