ThreadLocal为什么容易内存泄露?

news2024/10/6 22:33:11

文章目录

  • 一、Java的四种引用
  • 二、ThreadLocal为什么容易内存泄露?
  • 三、源码

一、Java的四种引用

1、强引用:强引用在程序内存不足(OOM)的时候也不会被回收
2、软引用:软引用在程序内存不足时,会被回收
3、弱引用:弱引用就是只要JVM垃圾回收器发现了它,就会将之回收
4、虚引用:虚引用大多被用于引用销毁前的处理工作

二、ThreadLocal为什么容易内存泄露?

ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。

Thread为每个线程维护了ThreadLocalMap这么一个Map,而ThreadLocalMap的key是LocalThread对象本身,value则是要存储的对象。
而key被保存到了弱引用WeakReference对象中,ThreadLocal在没有外部强引用时,发生GC时会被回收(弱引用就是只要JVM垃圾回收器发现了它,就会将之回收),而这个Entry对象中的value就有可能一直得不到回收,那时就会发生内存泄露。

三、源码

  //set方法
  public void set(T value) {
        // 得到当前线程对象
        Thread t = Thread.currentThread();
        //获取ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        // 如果map存在,则将当前线程对象t作为key,要存储的对象作为value存到map里面去
        if (map != null)
            map.set(this, value);
        else
            //如果不存在,则创建一个
            createMap(t, value);
    }
  //创建ThreadLocalMap
  void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
 
    //get方法
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }
static class ThreadLocalMap {
        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;
            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
        ...
    }

ThreadLocal 的经典使用场景是数据库连接和 session 管理等。

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

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

相关文章

前端axios fetch 解决接口请求响应数据返回快慢不均导致的数据错误问题

引言 搜索功能&#xff0c;我想很多业务都会涉及&#xff0c;这个功能的特点是&#xff1a; 用户可以在输入框中输入一个关键字&#xff0c;然后在一个列表中显示该关键字对应的数据&#xff1b;输入框是可以随时修改/删除全部或部分关键字的&#xff1b;如果是实时搜索&…

Go学习圣经:0基础精通GO开发与高并发架构(1)

GO 学习圣经&#xff1a;底层原理和实操 说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer…

高并发线程内存事件处理器 disruptor 三 高性能原理

一 disruptor为什么快的核心原理 属性填充&#xff1a;通过添加额外的无用信息&#xff0c;避免伪共享问题 什么是共享内存 在系统内存中&#xff0c;我们的数据存在于cpu缓存中&#xff0c;cpu缓存的基础缓存单位为 cache line&#xff0c;通常cache line的大小为64字节&…

什么是测试策略?怎么制定测试策略?测试管理篇

之前说了太多的测试技术和测试用例设计方法&#xff0c;猛地发现有点“偏科“了。今天我们放松一些&#xff0c;泡一杯茶&#xff0c;一起来聊一聊测试策略吧。 当然&#xff0c;文章脉络肯定是咱们老三样&#xff1a;什么是测试策略&#xff0c;为什么要制定测试策略&#xff…

5个最好的WooCommerce商城自动化动作来增加销售量

您是否正在寻找简单智能的方法来自动执行任务并增加 WooCommerce 商店的销售额&#xff1f; 通过在线商店中的自动化任务&#xff0c;您可以在发展业务和增加销售额的同时节省时间和金钱。 在本文中&#xff0c;我们将向您展示如何使用 WooCommerce商城自动化来增加销售额。 …

Puppeteer入门实践

环境 1、安装nodejs 官网&#xff1a;https://nodejs.org/zh-cn 下载安装好nodejs只后 验证&#xff1a;node -v 出现版本号表示安装成功&#xff0c;否则需要配置环境变量 2、创建node项目并初始化 随便新建一个文件夹 进入文件夹搜索cmd回车 执行npm init -y 安装依赖 …

RabbitMq--- 惰性队列

前言 消息堆积是Mq消费时常见的问题&#xff0c;这里我们展开说一下消息堆积的原因&#xff0c;以及RabbitMq 中是如何解决这个问题的。 1. 消息堆积问题 当生产者发送消息时的速度超过了消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积&#xff0c;直到队列存储…

【Linux】shell脚本—正则表达式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、正则表达式概述二、基本的正则表达式三、操作演示 一、正则表达式概述 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、…

WIN11+CLion+CMake+MINGW+OPENCV编译需注意问题

安装编译教程可参考以下链接&#xff1a; CLion OpenCV cmake&#xff0c;源码编译及使用_clion编译opencv_拜阳的博客-CSDN博客 使用CLion开发openCV——环境搭建全记录_-Willing-的博客-CSDN博客 此文主要是记录自己在编译过程中遇到的问题和解决方法 1、版本问题 C…

Windows 10 主机上的 VMware Workstation 和设备/凭据防护不兼容“错误

Windows 10 主机上的 VMware Workstation 和设备/凭据防护不兼容“错误 VMware Workstation 和 Device/Credential Guard 不兼容。VMware 工作站可以在禁用设备/凭据防护后运行。 排查错误的过程&#xff1a; 要解决错误&#xff0c;请按照以下步骤操作&#xff1a; 如果您…

LDR6020 【USB_C显示器方案】台式显示器方案介绍

首先介绍一下什么是Type-c接口&#xff1f; 现在显示器上常见的有这几种接口&#xff1a;HDMI、DP、USB-A、USB-C&#xff08;USB Type-c接口&#xff09;、3.5mm和电源接口&#xff0c;像之前流行的VGA接口和DVI接口&#xff0c;基本上在新显示器上&#xff0c;尤其是中高端显…

什么是频谱型温振变送器(附常见振动故障特征)

在机械振动方面&#xff0c;振动分析是一项十分重要的技术。这项技术是预测维修程序中的基础&#xff0c;是机器状态的指示器&#xff0c;为了避免机械设备异常振动所带来的损失&#xff0c;对工业机械设备做振动分析是非常有必要的&#xff01; 频谱型温振变送器是一款选用了M…

阿里高级工程师对C语言预处理指令的理解

目录 预处理器指令列表 预处理器指令的流程 四种主要类型的预处理器指令 结论 我们可以将预处理器视为一个编译过程&#xff0c;该过程在开发人员运行程序时运行。它是使用 c/c 语言执行程序的预处理。若要初始化预处理器命令的进程&#xff0c;必须使用哈希符号 &#xf…

【Devops运维】Docker搭建jenkins自动化编译hadoop/spark/flink/hive/kyuubi/trino大数据组件

Docker搭建jenkins DevOps概念Docker部署Jenkins制作Jenkins镜像Dockerfile及所依赖的脚本build镜像 利用docker-compose部署jenkins 配置Jenkins管理员密码插件安装系统配置全局工具配置MAVEN 配置JDK 配置GIT 配置MAVEN 配置 Jenkins Maven Git 自动化编译找到token生成界面…

ChatGPT:使用OpenAI创建自己的AI网站,使用 flask web框架快速搭建网站主体

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。 使用 flask web框架快速搭建网站主体 之前…

C++:布隆过滤器和哈希切分

目录 一. 什么是布隆过滤器 二. 布隆过滤器的实现 2.1 数据插入函数set 2.2 判断数据是否存在函数test 2.3 布隆过滤器数据的删除 三. 哈希切分 一. 什么是布隆过滤器 在我之前的博客C&#xff1a;使用位图处理海量数据_【Shine】光芒的博客-CSDN博客中&#xff0c;介绍了…

【LinuxShell】linux防火墙之firewalld防火墙

文章目录 前言一、firewalld概述1. 概念2. firewalld和iptables的关系 二、firewalld网络区域1. firewalld区域的概念2. firewalld预定义区域3. firewalld数据包的处理3.1 firewalld数据处理流程3.2 firewalld检查数据包的源地址的规则3.3 总结 三、firewalld防火墙的配置方法1…

“GPT+医疗健康”:给予医疗领域新机遇

现如今&#xff0c;GPT十分火热。随着人们对健康医疗的关注越来越热切&#xff0c;GPT已逐渐成为健康医疗领域的重要角色之一。GPT可以用于许多医疗语境中&#xff0c;如医学咨询、病症诊断、健康建议、在线问诊、患者教育、健康数据跟踪等。 GPT是一种基于深度学习的自然语言处…

结构体-C语言

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【Python办公自动化】python实现将图片插入到word中指定位置并将word转换为图片

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…