ThreadLocal为什么容易内存泄露?

news/2024/11/7 21:28:08/

文章目录

  • 一、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();//获取ThreadLocalMapThreadLocalMap map = getMap(t);// 如果map存在,则将当前线程对象t作为key,要存储的对象作为value存到map里面去if (map != null)map.set(this, value);else//如果不存在,则创建一个createMap(t, value);}//创建ThreadLocalMapvoid 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.ppmy.cn/news/74412.html

相关文章

日用行业外贸ERP软件系统,提高工作效率降低成本

日用行业是一个广泛的行业&#xff0c;包括了许多不同的产品&#xff0c;如家居用品、化妆品、个人护理用品、厨房用具等等。日用行业产品出口&#xff0c;也是我国传统外贸产业之一&#xff0c;在外贸市场来说相对有竞争力优势&#xff0c;在国际贸易中具有很大的需求和市场潜…

Android中的蓝牙技术

随着智能化生活的发展&#xff0c;手机成为人们生活的必需品&#xff0c;而蓝牙技术也随之应运而生。蓝牙技术作为现代移动设备与设备之间传输数据的一种主流方式&#xff0c;已经广泛应用于手表、耳机、车载系统等多种设备。在Android设备中&#xff0c;蓝牙技术也被大量使用&…

MATLAB画图相关操作

axis([x_min,x_max,y_min,y_max]) %设置坐标轴范围 set(gca,‘XTick’,[-1:0.2:1]) % 设置坐标刻度 xlabel(‘x轴数据’); ylabel(‘y轴数据’); title(‘标题’); legend(‘图例1’,‘图例2’) % 去掉图例边框 legend boxoff; % 法2 % 设置绘图外围颜色 set(gcf, ‘Colo…

vue的路由的原理(自己封装一个vue-router插件)

vue的路由的原理 前言&#xff1a;路由实例化&#xff1a;路由匹配&#xff1a;路由跳转&#xff1a;路由钩子&#xff1a;插件调用install方法封装RouterView封装RuoterLink详细步骤main.js\src\router\index.js\src\plugins\router.js\src\plugins\components\RouterView.js\…

八.异常控制流ECF

异常 类别原因异步/同步返回行为示意图中断来自IO设备的信号异步下一条指令陷阱有意的异常同步下一条指令&#xff0c;如syscall(系统调用)故障潜在可恢复的错误同步可能返回到当前指令终止不可恢复的错误同步不会返回 故障中的“除法错误”、“一般保护故障”会直接终止&…

用Powerpoint (PPT)制作并导出矢量图、高分辨率图

论文写作时经常需要导入矢量图&#xff0c;正规军都是用AI或者Inkscape作图&#xff0c;但是PPT更加适合小白用户&#xff0c;或者一些简单的构图需求使用PPT更加便捷&#xff0c;而且不得不承认PPT的某些功能是真的香&#xff0c;例如&#xff1a;简单的对齐、文字插入和格式修…

[网鼎杯 2020 青龙组]jocker 题解

32位无壳 堆栈有问题 先修堆栈在反编译 查看关键函数 对输入的字符串进行了加密 加密之后omg函数中与存储的字符串进行比较 我们先解密这个 提取数据 解密脚本 data[0x66,0x6b,0x63,0x64,0x7f,0x61,0x67,0x64,0x3b,0x56,0x6b,0x61,0x7b,0x26,0x3b,0x50,0x63,0x5f,0x4d,0x5…

ubuntu18安装中文环境

如果你在Ubuntu 18.04安装过程中选择了中文语言环境&#xff0c;但是在启动后却出现了英文界面&#xff0c;可能是因为Ubuntu的语言设置没有被正确识别。你可以尝试以下方法来解决这个问题&#xff1a; 修改语言环境设置&#xff1a; 打开终端&#xff08;Terminal&#xff0…