ThreadLocal为什么会出现内存泄漏,你真的知道吗?

news2025/7/17 16:07:12

目录

1 前言

2 ThreadLocal进行线程隔离的小示例

3 原因

1 前言

大家想要搞清楚这个问题,就必须知道内存泄漏和内存溢出的区别

内存泄漏:不就被使用的对象或者变量无法被回收

内存溢出:没有剩余的空间来创建新的对象

2 ThreadLocal进行线程隔离的小示例

同一个threadlocal对象,不同线程之间存储的值是获取不到的

public class QuThreadLocal {

  static ThreadLocal<Wolf> t1 =  new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(()->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t1.set(new Wolf("小王"));
            System.out.println(t1.get());
            t1.remove();
        }).start();


        new Thread(()->{
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(t1.get());
        }).start();
    }
}

控制台输出: 

 可以发现在不同的线程里面放置东西,其它线程里面是找不到的。

解析原因,观察是如何向threadlocal中放置值的:

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

1)先获取当前线程t,然后根据t获取threadmap对象

2)判断map是否为null,map不为null时,将当前threadllocal对象作为key,想要设置的值作为value放置其中,否则就创建一个map。创建map的key值与上相同。

这也表明了,存储的值只有当前线程才能够获取到。

3 原因

造成内存泄漏的原因:

        由于Entry中的value是强引用,key是弱引用;当垃圾回收器回收threadlocal时,由于value是强引用,不能被回收,所以造成了内存泄漏。

        因此,ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应的key就会导致内存泄漏,而并不是因为弱引用。

解决方案一:扩大成员变量Threadlocal的一个作用域,避免被GC回收(不推荐)

解决方案二:每次使用完threadlocal之后,就调用remove方法去移除对应的数据(推荐)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中的字符串

&#x1f649; 作者简介&#xff1a; 全栈领域新星创作者 &#xff1b;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求&#xff0c;把分享变成一种习惯&#xff0c;再小的帆也能远航。 &#x1f3e1; 个人主页&#xff1a;xiezhr的个人主页 java中的字符串一、简…

C++:重定义:符号重定义:变量重定义

概述&#xff1a;在上一篇我们知道 通过 #ifndef....#defin....#endif &#xff0c; 这个解决头文件重复包含的问题 C&#xff1a;重定义&#xff1a;class类型重定义_hongwen_yul的博客-CSDN博客 避免头文件的重复包含可以有效的避免变量的重复定义&#xff0c;其实不光变量…

[附源码]java毕业设计基于web旅游网站的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用Docker开发GO应用程序

根据Stack Overflow的2022开发者调查&#xff0c;Go&#xff08;或Golang&#xff09;是最受欢迎和最受欢迎的编程语言之一。由于与许多其他语言相比&#xff0c;Go的二进制大小更小&#xff0c;开发人员经常使用Go进行容器化应用程序开发。 Mohammad Quanit在他的社区全能课程…

小程序vant-tabbar使用示例,及报错处理

小程序vant-tabbar使用示例&#xff0c;及报错处理1. 配置信息2. 添加 tabBar 代码文件3. 编写 tabBar 代码custom-tab-bar/index.tscustom-tab-bar/index.jsoncustom-tab-bar/index.wxml使小程序使用vant-tabbar组件时&#xff0c;遇到以下报错&#xff1a;Couldn’t found th…

Java基于springboot+vue的儿童玩具销售购物网站 多商家

爱玩儿是所有孩子的天性。尤其是在婴幼儿阶段。选择一个好的玩具&#xff0c;不仅能够让孩子玩儿的开心&#xff0c;而且有助于孩子智力的开发。很多家长在选择玩具的时候&#xff0c;不知道选择什么样的玩具。且当前玩具市场的玩具鱼目混杂&#xff0c;种类繁多&#xff0c;而…

SAR信号处理基础1——线性调频信号

关键字&#xff1a;线性调频信号&#xff0c;LFM信号&#xff0c;chirp信号&#xff0c;驻定相位原理&#xff08;POSP&#xff09;&#xff0c;泰勒展开&#xff0c;Taylor展开&#xff0c;脉冲压缩&#xff0c;匹配滤波&#xff0c;sinc&#xff0c;分辨率&#xff0c;峰值旁…

QProgressDialog.close()失败,进度条关闭感觉失败了,无法彻底关闭

开发环境&#xff1a;我是在deepin&#xff08;深度&#xff09;系统下开发的&#xff0c;在我本机上&#xff0c;一点问题也没有&#xff0c;但是我移植到了ubantu的机子上&#xff0c;就偶尔出现出个问题&#xff0c;出现了一个模态框&#xff0c;需要重启软件才能关闭。 问题…

Vue的computed和watch的区别是什么?

一、computed介绍 computed 用来监控自己定义的变量&#xff0c;该变量在 data 内没有声明&#xff0c;直接在 computed 里面定义&#xff0c;页面上可直接使用。 //基础使用 {{msg}} <input v-model"name" /> //计算属性 computed:{msg:function(){return …

【MySQL】MySQL日志系统以及InnoDB背后的技术(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Java基于springboot+vue的个人博客网站 前后端分离

随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多网站的之中&#xff0c;随之就产生了“博客网站”&#xff0c;这样就让博客网站更加方便简单。 对于本博客网站的设计来说&#xff0c;系统开发主要是采用java语言技…

2022国产8K摄像机介绍

摄像机是一种把光学图像信号转变为电信号&#xff0c;以便于存储或者传输的设备。当我们拍摄一个物体时&#xff0c;此物体上反射的光被摄像机镜头收集&#xff0c;使其聚焦在摄像器件的受光面&#xff08;例如摄像管的靶面&#xff09;上&#xff0c;再通过摄像器件把光转变为…

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting 神经预测的最新进展加速了大规模预测系统性能的提高。然而,长期预测仍然是一项非常困难的任务。影响这项任务的两个常见挑战是预测的波动性和它们的计算复杂性。本文提出N-HiTS,一种通过结合新的分层…

不同字符编码对比

目录 1. ASCII码 2. Unicode 3. GBK编码 1. ASCII码 ASCII码使用一个字节编码&#xff0c;但只适用于英文&#xff1b; 2. Unicode Unicode定义了字符集&#xff0c;有 17 个 code plane&#xff0c;总共规划了 1,114,112 个 code point。而这些字符可以使用UTF-8、UTF-1…

Windows无法访问指定设备、路径或文件怎么办?

如何解决Windows 无法访问指定的设备、路径或文件错误&#xff1f; 1.修改安全中心的设置 如果在安装程序的过程中&#xff0c;遇到该错误&#xff0c;可以进入到【Windows安全中心】进行设置修改。 第一步&#xff1a;点击左下角的开始按钮&#xff0c;然后依次点击【设置】…

直接安装WSL2及安装Ubuntu到F盘

1. 勾选这三项&#xff0c;重启 2. 以管理员方式运行powersell wsl --updatewsl --shutdownwsl --set-default-version 2wsl --status3. 解压缩ubuntu 解压缩Ubuntu_1804.2019.522.0_x64.appx到F盘 4. 安装ubuntu 双击ubuntu1804.exe安装 5. 运行 双击ubuntu1804.exe …

AI人工智能实践技术系统性教学方案

郁磊老师【副教授】 &#xff1a;长期从事Python、Matlab机器学习及深度学习等研究工作&#xff0c;具备良好的数学及信号处理基础&#xff0c;熟悉如神经网络、支持向量机、决策树、随机森林等&#xff0c;以及群优 化算法&#xff0c;如遗传算法、蚁群算法、蝙蝠算法等&#…

React源码解读之更新的创建

React 的鲜活生命起源于 ReactDOM.render &#xff0c;这个过程会为它的一生储备好很多必需品&#xff0c;我们顺着这个线索&#xff0c;一探婴儿般 React 应用诞生之初的悦然。 更新创建的操作我们总结为以下两种场景 ReactDOM.rendersetStateforceUpdate ReactDom.render …

k8s-dynamic-pvc

安装 storage class: external-storage/nfs-client/deploy at master kubernetes-retired/external-storage GitHub 下载文件并安装: class.yaml deployment.yaml rbac.yaml 其中修改: 安装 测试: [rootmaster test-dir]# cat nginx-1.yaml apiVersion: v1 kind: Pers…

【Pytorch with fastai】第 4 章 :底层训练数字分类器

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…