当前位置: 首页 > news >正文

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&#xff0c;值作为value保存&#xff0c;他继承WeakReference&#xff0c;super(k)&#xff0c;代表了Threadlocal对象是一个弱引用&#xff1b; 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-…...

多叉树的深度优先遍历(以电话号码的字母组合为例)

在我们的座机上&#xff0c;都有这种数字与字母对应的按键。 以此为例&#xff0c;讲解多叉树的深度优先遍历 问题 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同…...

【YashanDB数据库】PHP无法通过ODBC连接到数据库

【问题分类】驱动使用 【关键字】ODBC、驱动使用、PHP 【问题描述】应用使用php-fpmnginx架构&#xff0c;通过php的ODBC拓展连接YashanDB时出现报错&#xff1a; [unixODBC][Driver Manager]Cant open lib /home/yashandb_odbc/libyas_odbc.so: file not found但是在应用所…...

C++ | Leetcode C++题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; 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-性能压测-性能监控-堆内存与垃圾回收

文章目录 一&#xff0c;两种类型的应用1&#xff0c;CPU密集型应用示例&#xff1a;Apache Spark 2&#xff0c;IO密集型应用示例&#xff1a;MySQL 二&#xff0c;监控 我们通过压力测试对接口进行了性能评估&#xff0c;以确定其是否满足性能要求。 如果不符合&#xff0c;就…...

大模型综述

《Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond》论文阅读 模型架构 两种架构&#xff1a; encoder-decoder架构/encoder架构:T5/BERTdecoder架构:GPT4 特点LLMsencoder-decoderorencoder-onlyBERT-style训练:掩码语言模型类型&#xff1a;…...

Python 常用内置函数

目录 1、enumerate函数 1.1、for循环中使用 1.2、enumerate指定索引的起始值 1.3、enumerate在线程中的作用 2、Map 函数 2.1、map()函数可以传多个迭代器对象 3、lambda表达式&#xff08;匿名函数&#xff09; 示例 4、sort函数和sorted函数 4.1、sort()函数 4.2、…...

什么是大数据?

1. 大数据定义 大数据到底是什么&#xff1f; 大数据的定义是数据种类更多、数量更多、速度更快。这也被称为三个“V”。 简单来说&#xff0c;大数据是更大、更复杂的数据集&#xff0c;尤其是来自新数据源的数据集。这些数据集非常庞大&#xff0c;传统数据处理软件根本无…...

Linux 内核源码分析---资源分配及系统总线

资源管理 Linux提供通用的构架&#xff0c;用于在内存中构建数据结构。这些结构描述了系统中可用的资源&#xff0c;使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下&#xff1a; 用于连接parent, child, sibling成员规则如下&#xff1a; 1、每个子结点只…...

C# POST请求 各种实现方法梳理

目录 1.首先是基础的参数 2.使用RestClient 3.使用封装库 4.使用微软原生库进行请求 5.使用HttpClient进行请求 C#代码中&#xff0c;实现Http/Https 中的POST请求&#xff0c;可以有很多种方式&#xff0c;下面就梳理下我常用的几种方式&#xff0c;给大家借鉴 1.首先…...

《MySQL数据库》数据导入、导出、表处理—/—<4>

一、插入数据 1、可使用外部工具navicat导入数据的情况下 因为部分公司不允许使用外部工具去导入数据 对于大批量数据&#xff0c;除了上节课中使用导入向导插入数据&#xff0c;也可在vscode中打开csv文件&#xff0c;然后选中光标&#xff0c;长按shiftctrl&#xff0c;拖动…...

Java I/O (Input/Output)——文件字节流

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java SE 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Java I/O 简介 Java I/O&#xff08;输入/输出&#xff09;是 Java 程序中…...

VisionPro二次开发学习笔记4-使用C#创建绘图图形

VisionPro提供了许多可以添加到CogDisplay的基本形状&#xff0c;例如CogCircle&#xff0c;CogRectangle&#xff0c;CogEllipse和CogRectangleAffine。这些形状可以是用户可以用鼠标操作的交互式图形&#xff0c;也可以是用户无法更改的静态形状。 若要在CogDisplay控件上绘…...

【langchain学习】使用JsonOutputParser让大模型生成结构化JSON数据

使用Langchain处理结构化数据&#xff0c;以JsonOutputParser为例。以下是具体步骤和代码示例&#xff1a; 导入所需库&#xff1a; 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总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频链接&#xff1a; https://www.bilibili.com/video/BV1EK41187…...

基于SpringBoot的Redis开发实战教程

配置和集成缓存涉及多个步骤&#xff0c;从选择适当的缓存技术到实现缓存的存取操作。以下是具体的步骤和示例&#xff0c;假设我们使用Redis作为缓存工具&#xff0c;并基于Spring Boot进行开发。 1. 选择和配置缓存技术 a. 选择缓存工具 Redis 是一个流行的内存数据结构存…...

mysql 分区操作

1。新建分区 mysql 没有全局唯一索引&#xff0c;因此所有涉及唯一索引的都需要加上分区键&#xff0c;因此要做好权衡&#xff0c;键分区不一定能提高效率哦&#xff0c;建分区的主要目的是为了分区查询和删除数据 --将CREATE_TIME 加入主键 ALTER TABLE your_table DROP PR…...

[网鼎杯 2018]Comment

使用环境为https://adworld.xctf.org.cn/challenges&#xff0c;搜索题目[网鼎杯 2018]Comment。 进入环境&#xff0c;发现为一个留言板&#xff0c;点击发帖试试。 尝试发帖 跳转到登录页面&#xff0c;根据提示使用burp进行暴力破解。 发现payload为666时状态码不同。 尝试…...

Arduino驱动AY-3-8910 PSG芯片的轻量级音频库

1. 项目概述 MOS Electronics AY-3-8910 Library 是一个面向 Arduino 平台的轻量级驱动库&#xff0c;专为通用仪器&#xff08;General Instrument&#xff09;于1978年推出的经典可编程声音发生器&#xff08;Programmable Sound Generator, PSG&#xff09;芯片 AY-3-8910 …...

终极指南:Kubernetes云原生生态与CNCF项目集成实战

终极指南&#xff1a;Kubernetes云原生生态与CNCF项目集成实战 【免费下载链接】kubernetes-handbook Kubernetes Handbook &#xff08;Kubernetes指南&#xff09; https://kubernetes.feisky.xyz 项目地址: https://gitcode.com/gh_mirrors/kub/kubernetes-handbook …...

WebGL着色器编程完全手册:GLSL语言从入门到精通

WebGL着色器编程完全手册&#xff1a;GLSL语言从入门到精通 【免费下载链接】WebGL The Official Khronos WebGL Repository 项目地址: https://gitcode.com/gh_mirrors/we/WebGL WebGL着色器编程是创建惊艳3D网页应用的核心技术&#xff01;&#x1f4a1; 作为WebGL的官…...

松下Panasonic伺服调试软件(支持MINAS - A/A3/A4/B/E/S系列与MDD...

松下Panasonic 伺服调试 软件 支持MINAS-A A3 A4 B E S 英文版 MDDA、MHDA、MSMA、MSDA、MDMA、可以修改参数、JOG点动调试、参数拷贝、复制等 松下 伺服 软件刚拿到台新拆箱的MHDA-MA3A1A伺服驱动器&#xff1f;或者翻出实验室积灰好几年的MSMA电机搭MDDA A1板子练手&#xff…...

Redis 全量主从同步和增量主从同步详解

Redis 主从同步:全量同步与增量同步详解 Redis 主从复制是实现高可用、读写分离和数据冗余的基础。复制过程分为全量同步和增量同步两种模式。理解它们的工作原理、触发条件及配置优化,是系统分析师设计高可用 Redis 架构的关键。 📌 一、主从复制基本概念 主节点(Master…...

Multus-CNI快速部署教程:5分钟搞定多网络接口配置

Multus-CNI快速部署教程&#xff1a;5分钟搞定多网络接口配置 【免费下载链接】multus-cni A CNI meta-plugin for multi-homed pods in Kubernetes 项目地址: https://gitcode.com/gh_mirrors/mu/multus-cni 在当今复杂的云原生环境中&#xff0c;Kubernetes Pod通常需…...

数据库SQL中的IN, NOT IN和NULL

一. 首先SQL中有一个原则: NULL与任何值比较都没结果 二. 假定有以下两个表: 表t1:idname1A2B3NULL表t2:idname1A2C3NULL1. 当使用 IN 查询 select * from t1 where t1.name in (select t2.name from t2);等价于 (t1.name1 t2.name1 or t1.name1 t2.name2 or ... ) or (t1.na…...

别只比功能了!从社区生态和未来路线图,聊聊Spring AI和LangChain4j谁更值得押注

从社区生态与战略布局看Spring AI与LangChain4j的长期价值 当技术决策者面对两个功能相近的开源项目时&#xff0c;功能对比表格往往只是决策的起点。真正决定技术选型成败的&#xff0c;是项目背后的社区活力、维护模式与长期演进路线。Spring AI与LangChain4j作为Java生态中两…...

BHVCC AI人工智能大鼠八臂视频迷宫实验步骤 八臂迷宫刺激器

八臂迷宫是一种用于研究动物空间记忆的迷宫模型。它由一个中心区和其周围连接的八条臂组成&#xff0c;在其中一些臂的末端放入食饵或将一些臂施以电击&#xff0c;根据动物的取食或逃避策略&#xff08;进入每个臂的次数、时间、错能&#xff08;如动物活动路径、各种时间、次…...

高并发场景下的订单和库存处理方案

前言之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案&#xff0c;我最近也是因为加班的原因比较忙&#xff0c;就一直没来得及回复。今天好不容易闲了下来想了想不如写篇文章把这些都列出来的&#xff0c;让大家都能学习到&#xff0c;说一千道一万都不如满满的干…...