首页 > 系统相关 >ThreadLocal和内存泄漏原理

ThreadLocal和内存泄漏原理

时间:2024-07-30 16:57:16浏览次数:20  
标签:泄漏 ThreadLocalMap ThreadLocal 线程 内存 key 引用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

复杂事简单说:ThreadLocal


一、ThreadLocal原理

每一个线程绑定一个ThreadLocalMap,里面存放该线程自己的数据,读取和操作的都是自己管理的数据,从而与其他线程的值区分开,避免线程不安全问题。
ThreadLocalMap中是entry数组,entry是kv对,k是threadLocal变量的弱引用,v是要管理的数据的强引用。

二、ThreadLocal内存泄漏

ThreadLocalMap的key是弱引用,gc时会回收,key回收了,但是value没被回收。线程结束时ThreadLocalMap才会被回收。
如果线程不结束(比如使用了线程池),则引用链(Thread -> ThreadLocalMap -> Entry -> value)一直存在,从而造成内存泄漏。
可以调用remove()方法清除。

myThreadLocal.remove() //从当前线程删除数据

三、为什么使用弱引用?

使用弱引用其实是一种促进内存回收的方式,使用强引用更难回收。ThreadLocal有一个机制是清除 ThreadLocalMap 中 key 为 null 的 value,使用弱引用就是为了gc时将key置为null。


总结

使用自己的语言描述ThreadLocal和内存泄漏原理。

标签:泄漏,ThreadLocalMap,ThreadLocal,线程,内存,key,引用
From: https://blog.csdn.net/laipapapa/article/details/140800387

相关文章

  • 动态内存管理
    ⽬录1.为什么要有动态内存分配2.malloc和free3.calloc和realloc4.常⻅的动态内存的错误5.动态内存经典笔试题分析6.柔性数组7.总结C/C++中程序内存区域划分正⽂开始1.为什么要有动态内存分配我们已经掌握的......
  • 合并两个数据帧时的内存问题
    我对倒数第二句话一无所知。错误是:numpy.core._exceptions.MemoryError:无法为形状为(7791676634)和数据类型为int64的数组分配58.1GiB我的想法是将约1200万条记录的数据帧与另一个数据帧合并多3-4列应该不是什么大问题。请帮帮我。完全被困在这里了。谢谢Select_Emp_df......
  • 编写java程序,自动监控程度,dump内存文件
    步骤1:编写Java程序首先,编写一个Java程序,当内存使用达到11GB时生成heapdump文件,并以日期命名。将以下代码保存为MemoryMonitor.java文件:importcom.sun.management.HotSpotDiagnosticMXBean;importjavax.management.MBeanServer;importjava.lang.managemen......
  • 使用 Python 中的多处理防止共享内存中的数据损坏?
    我目前正在开发一个多处理Python程序,其中每个进程将其索引作为连续的4字节整数写入共享内存。并且有一个读取器可以在没有任何锁的情况下读取其他进程的索引。因为我没有使用任何同步原语,所以我担心读取器进程可能会由于逐字节写入内存而读取损坏的数据(例如,一个索引的前2个......
  • 动态内存管理(含经典笔试题)
    文章目录1.为什么要动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc3.1calloc3.2realloc4.常见的动态内存的错误4.1对NULL指针的解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使用free函数释放4.4使用free释放一块动态开辟......
  • C++从入门到起飞之——内存管理(万字详解) 全方位剖析!
    ......
  • 高并发内存池(五)Thread Cache、Central Cache回收功能的实现
    目录一、ThreadCache的回收实现1.1ThreadCache回收框架1.2ThreadCache回收实现二、CentralCache2.1CentralCache回收框架2.2CentralCache回收实现一、ThreadCache的回收实现1.1ThreadCache回收框架在实现完整的高并发内存池内存分配逻辑以后,回收逻辑就变得......
  • 内存空间的布局以及全局变量和局部变量
    在这里先了解两个概念:作用域和生命周期——      作用域:定义了变量或函数的可访问性。它决定了在代码中的哪个部分可以访问到特定的变量或函数。      生命周期:生命周期指的是变量或对象从创建到销毁的过程。      现在我们可以学习全局......
  • Linux——手动清理内存缓存
    前言:使用free-m命令可以查看内存缓存。一、方法1.1先进管理员账户,然后进root账户1.2运行下面的命令:syncecho1>/proc/sys/vm/drop_caches#清空目录项缓存echo0>/proc/sys/vm/drop_caches#还原默认配置,这一步如果出错,则不用管sync二、小贴士......
  • 生产环境CDH集群主机加内存导致系统无法启动,重装系统后CDH数据修复的过程
    原因:因为主机扩容内存重启以后发现有七台服务器无法进入系统,重启之前Centos7的启动项被修改过导致无法重启,只能重新安装操作系统,但是HDFS的数据是保存到data盘中.系统OS:CentOSLinuxrelease7.6.1810(Core)CDH版本:6.2.1重新安装操作系统的服务器10.170.12.43db-p......