ThreadLocal 详解(三)内存泄露原因,以及强弱引用
1、ThreadLocal内存泄漏
在Threadlocal的内部静态类中Entry将Threadlocal作为一个key,值作为value保存,他继承WeakReference,super(k),代表了Threadlocal对象是一个弱引用;
static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}
}
内存泄漏原因:
- 没有手动删除这个Entry,调用remove()
- CurrentThread当前线程仍然在运行
对于第一点:只有使用完Threadlocal,调用其remove()删除对应对的Entry,可以避免内存泄漏;
对于第二点:
- ThreadlocalMap作为Thread的一个变量,只要Thread运行,那么ThreadlocalMap就不会被清理掉。
- 通过上面源码可以看出,Threadlocal运行在一个方法中,在虚拟机栈的局部变量表中某个slot上,指向了内存空间中该Threadlocal对象,假设调用了get()方法后,ThreadlocalMap中的一个Entry指向了Threadlocal实例,且是弱引用,该方法执行完成,虚拟机栈释放。此时只有ThreadLocalMap中的一个Entry指向ThreadLocal对象
- 此时发生GC,根据弱引用的特点,如果一个对象只有弱引用,该对象将被回收,此时ThreadlocalMap中出现一个entry(null,Entry)
-
ThreadLocalMap中就会出现 key 为 null 的 Entry。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。
总结:由于ThreadLocalMap 的生命周期跟 Thread 一样长,对于重复利用的线程来说,如果没有手动删除(remove()方法)对应 key 就会导致entry(null,value)的对象越来越多,从而导致内存泄漏.
2、为什么不将key设置为强引用
那么为什么ThreadLocalMap的key要设计成弱引用呢?其实很简单,如果key设计成强引用且没有手动remove(),那么key会和value一样伴随线程的整个生命周期。假设在业务代码中使用完ThreadLcoal,ThreadLocal ref被回收了,但是ThreadLocalMap强引用了Threadlocal(Key就是ThreadLocal),造成了ThreadLocal无法被回收。在没有手动回收Entry以及CurrentThread依然运行的前提下,始终有强引用链 CurrentThread Ref -> CurrentThread -> ThreadLocalMap -> entryEntry就不会被回收( Entry中包括了ThreadLocal实例和value), 导致Entry内存泄漏

结尾:喜欢的朋友点个赞吧!!!
相关文章:
ThreadLocal 详解(三)内存泄露原因,以及强弱引用
1、ThreadLocal内存泄漏 在Threadlocal的内部静态类中Entry将Threadlocal作为一个key,值作为value保存,他继承WeakReference,super(k),代表了Threadlocal对象是一个弱引用; static class Entry extends WeakReference…...
【Android面试八股文】说一说Android开发模式之MVC、MVP、MVVM的区别?
文章目录 一、 MVC(Model-View-Controller)二、 MVP(Model-View-Presenter)三、MVVM(Model-View-ViewModel)四、示例代码4.1. MVC 示例4.2. MVP 示例4.3. MVVM 示例五、总结在Android开发中, MVC(Model-View-Controller)MVP(Model-View-Presenter)MVVM(Model-View-…...
多叉树的深度优先遍历(以电话号码的字母组合为例)
在我们的座机上,都有这种数字与字母对应的按键。 以此为例,讲解多叉树的深度优先遍历 问题 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同…...
【YashanDB数据库】PHP无法通过ODBC连接到数据库
【问题分类】驱动使用 【关键字】ODBC、驱动使用、PHP 【问题描述】应用使用php-fpmnginx架构,通过php的ODBC拓展连接YashanDB时出现报错: [unixODBC][Driver Manager]Cant open lib /home/yashandb_odbc/libyas_odbc.so: file not found但是在应用所…...
C++ | Leetcode C++题解之第326题3的幂
题目: 题解: class Solution { public:bool isPowerOfThree(int n) {return n > 0 && 1162261467 % n 0;} };...
Ubuntu20.4上搭建FFMPEG开发环境
编译ffmpeg命令如下: 1.安装yasm(ffmpeg里面有汇编语言的部分,所以需要安装一下yasm) wget 5http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar xvzf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install 2.安装nasm(2.13以上…...
谷粒商城实战笔记-144-性能压测-性能监控-堆内存与垃圾回收
文章目录 一,两种类型的应用1,CPU密集型应用示例:Apache Spark 2,IO密集型应用示例:MySQL 二,监控 我们通过压力测试对接口进行了性能评估,以确定其是否满足性能要求。 如果不符合,就…...
大模型综述
《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》论文阅读 模型架构 两种架构: encoder-decoder架构/encoder架构:T5/BERTdecoder架构:GPT4 特点LLMsencoder-decoderorencoder-onlyBERT-style训练:掩码语言模型类型:…...
Python 常用内置函数
目录 1、enumerate函数 1.1、for循环中使用 1.2、enumerate指定索引的起始值 1.3、enumerate在线程中的作用 2、Map 函数 2.1、map()函数可以传多个迭代器对象 3、lambda表达式(匿名函数) 示例 4、sort函数和sorted函数 4.1、sort()函数 4.2、…...
什么是大数据?
1. 大数据定义 大数据到底是什么? 大数据的定义是数据种类更多、数量更多、速度更快。这也被称为三个“V”。 简单来说,大数据是更大、更复杂的数据集,尤其是来自新数据源的数据集。这些数据集非常庞大,传统数据处理软件根本无…...
Linux 内核源码分析---资源分配及系统总线
资源管理 Linux提供通用的构架,用于在内存中构建数据结构。这些结构描述了系统中可用的资源,使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下: 用于连接parent, child, sibling成员规则如下: 1、每个子结点只…...
C# POST请求 各种实现方法梳理
目录 1.首先是基础的参数 2.使用RestClient 3.使用封装库 4.使用微软原生库进行请求 5.使用HttpClient进行请求 C#代码中,实现Http/Https 中的POST请求,可以有很多种方式,下面就梳理下我常用的几种方式,给大家借鉴 1.首先…...
《MySQL数据库》数据导入、导出、表处理—/—<4>
一、插入数据 1、可使用外部工具navicat导入数据的情况下 因为部分公司不允许使用外部工具去导入数据 对于大批量数据,除了上节课中使用导入向导插入数据,也可在vscode中打开csv文件,然后选中光标,长按shiftctrl,拖动…...
Java I/O (Input/Output)——文件字节流
博客主页:誓则盟约系列专栏:Java SE 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Java I/O 简介 Java I/O(输入/输出)是 Java 程序中…...
VisionPro二次开发学习笔记4-使用C#创建绘图图形
VisionPro提供了许多可以添加到CogDisplay的基本形状,例如CogCircle,CogRectangle,CogEllipse和CogRectangleAffine。这些形状可以是用户可以用鼠标操作的交互式图形,也可以是用户无法更改的静态形状。 若要在CogDisplay控件上绘…...
【langchain学习】使用JsonOutputParser让大模型生成结构化JSON数据
使用Langchain处理结构化数据,以JsonOutputParser为例。以下是具体步骤和代码示例: 导入所需库: from config import llm from langchain_core.output_parsers import JsonOutputParser from langchain_core.prompts import PromptTemplate f…...
【学习笔记】Matlab和python双语言的学习(最大最小化规划)
文章目录 前言一、最大最小化规划二、选址问题三、代码实现----Matlab1.Matlab 的 fminimax 函数2.Matlab 代码 四、代码实现----python总结 前言 通过模型算法,熟练对Matlab和python的应用。 学习视频链接: https://www.bilibili.com/video/BV1EK41187…...
基于SpringBoot的Redis开发实战教程
配置和集成缓存涉及多个步骤,从选择适当的缓存技术到实现缓存的存取操作。以下是具体的步骤和示例,假设我们使用Redis作为缓存工具,并基于Spring Boot进行开发。 1. 选择和配置缓存技术 a. 选择缓存工具 Redis 是一个流行的内存数据结构存…...
mysql 分区操作
1。新建分区 mysql 没有全局唯一索引,因此所有涉及唯一索引的都需要加上分区键,因此要做好权衡,键分区不一定能提高效率哦,建分区的主要目的是为了分区查询和删除数据 --将CREATE_TIME 加入主键 ALTER TABLE your_table DROP PR…...
[网鼎杯 2018]Comment
使用环境为https://adworld.xctf.org.cn/challenges,搜索题目[网鼎杯 2018]Comment。 进入环境,发现为一个留言板,点击发帖试试。 尝试发帖 跳转到登录页面,根据提示使用burp进行暴力破解。 发现payload为666时状态码不同。 尝试…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
