在web项目中使用 ThreadLocal 要谨慎,使用不当容易造成内存溢出

【八股文】10 项目 session和token都是用来保持会话,功能相同service层。存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,他有接口还有接口的实现方法,在接口的实现方法中需要导入mapper层,mapper层是直接跟数据库打交道的,他也是个接口,只有方法名字,具体实现在mapper.xml文件里,service是供我们使用的方法。entity层 别名: model层 ,domain层 用途: 实体层,用于存放我们的实体类,与数据库中的属性值基本保持一致,实现set和get的方法。 例子: 阅读详情

这里使用的servlet容器是 tomcat

如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。纠正,ThreadLocal 中的引用是软引用,只有当JVM GC 后发现内存还是不够,才会回收软引用。

说明原因前
1:先讲一下 ThreadLocal,Thead,ThreadLocalMap 三者之间的一个关系。(大家可以去看一下ThreadLocal的实现源码,可而参考我的另一篇文章点击查看)
ThreadLocalMap 是 ThreadLocal 的一个内部类,一看是Map,保存数据的形式就是key value 形式的。
Thread类有一个成员变量 threadLocals,这个变量的数据类型是 ThreadLocal.ThreadLocalMap。threadLocals保存数据的key是ThreadLocal本身

2:tomcat线程池
tomcat启动的时候会创建一个线程池,配置如下

<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"
connectionTimeout="20000" redirectPort="8443" />

maxThreads=“600” ///最大线程数
minSpareThreads=“100”///初始化时创建的线程数
maxSpareThreads=“500”///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount=“700”//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

这里说一下为什么 如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。
如果调用 ThreadLocal 的 set 方法 将一个对象放入Thread中的成员变量threadLocals 中,那么这个对象是永远不会被回收的,因为这个对象永远都被Thread中的成员变量threadLocals引用这。

如果想让垃圾收集器回收它,有两种方法
1:将该线程从tomcat线程池中去除,当一个线程被回收的时候何况它的成员变量呢,但是tomcat启动一般都会配置一个线程池进行优化,所有该方法不太现实。
2:调用 ThreadLocal 的 remove 方法 将对象从hread中的成员变量threadLocals 中删除掉。

设想如果将一个大对象放入threadLocals 中,并且还没有remove。那么就可能会造成OutOfMemoryError,如果不会造成OutOfMemoryError那么也很浪费java堆内存

web应用程序[ROOT]创建了一个ThreadLocal,其键类型为[java.lang.ThreadLocal],但在停止web应用程序时未能将其删除。线程将随着时间的推移而更新 org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks问题如下解决办法 问题如下 每次在关闭Tomcat的时候都会报线程未关闭,内存泄漏问题。大致如下 07-Oct-2020 15:14:14.699 严重 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks web应用程序[ROOT]创建了一个T 阅读详情

相关推荐

Oracle 11g R2 RAC 到单实例 Data Guard 搭建(RMAN备份方式)

Oracle RAC集群到单机的dataguard搭建过程

驰兔的博客 1723

排查日志:apm在网关webflux变量丢失

文章目录前言场景排查过程结论 前言 在自研apm项目中,发现网关traceId会被篡改 具体逻辑,有拦截器,然后在请求处理前,set tarceId,然后set到对应threadlocal里面,然后在mono返回的时候,从threadlocal拿出值,打印日志。 场景 a请求,traceId为123,b请求,traceId为666.在链路监控里头,会发现a的请求traceId被b覆盖了变成666 排查过程 threadlocal本身就会导致变量丢失 打印对应的日志查看线程名称,发现都是同个线程react

大鸡腿的博客 1530

【论文泛读|附源码】如何进行动力学重构? 神经网络自动编码器结合SINDy发现数据背后蕴含的方程

这一篇文章叫做 **数据驱动**的**坐标发现与方程发现算法**。想回答的问题很简单,就是根据数据写方程。 想想牛顿的处境,如何根据各种不同物体下落的数据,写出万有引力的数学公式的。这篇文章就是来做这件事的。当然,这篇论文并没有从牛顿视角,完全去思考牛顿所想。而是利用现有的**深度学习技术** 和 **动力学重构的方法** 。提出了一种框架,基于现有的计算机技术,去发现物质运动背后的物理规律。 这里直接给出这篇方法的核心思路图,我们后面会逐个讲解。

qq5q13638的博客 2460

javaWeb-8-Filter过滤器+ThreadLocal的使用

目录 1、什么是Filter过滤器-API全集 2、Filter的初体验 2.1 Filter过滤器的初体验之要求 2.2 项目结构 2.2.1 在项目的web目录下放置需要访问的资源 2.2.2 编写一个过滤器Filter:AdminFilter implement Filter 2.2.3 编写一个用户处理登录的动态资源处理器Servlet:LoginServlet extends HttpServlet 2.2.4 在web.xml文件中配置Filter的拦截路径和Servlet的访问

风暴计划 1030

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何高效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 278

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解——windows应急响应篇

保护数据,捍卫安全,展现技能,赢得荣耀!全国职业技能大赛-信息安全与评估大赛,挑战你的技术,揭示黑客的秘密!加入我们,成为信息安全的守护者!

人若无名,便可专心练剑 909

为什么响应式编程无法从Threadlocal里获取数据?

响应式编程模型(如 Spring WebFlux)和传统的 Servlet 基于线程的模型(如 Spring MVC)在处理请求的方式上有显著不同。在传统的 Spring MVC 应用中,每个请求都是由一个固定的线程处理的,因此可以便利地使用。然而,在响应式编程模型中,因为处理流程可能在多个线程之间切换,所以无法保证整个请求处理链在同一个线程中执行。是跟随响应式流的,并且可以在响应式链中的不同操作和不同线程间保持数据的连贯性。的数据是绑定到特定线程的,当请求处理跳转到新的线程时,原线程的。

主要作为个人的笔记用,Not For Everyone。 956

深度学习驱动的股票波动率预测:LSTM和Transformer模型的实战解析

股票市场的波动率一直是金融领域关注的焦点之一。波动率预测对于风险管理、期权定价和资产配置至关重要。深度学习模型,如长短时记忆网络(LSTM)和Transformer,已经在时间序列数据分析领域取得了显著的成就。本博客将向您展示如何使用这两种深度学习模型来进行股票波动率预测,提供清晰的思路和相应的Python代码,以帮助您理解和应用这一重要任务。

斌擎科技 974

[项目实战笔记]-使用ThreadLocal请务必remove

场景说明:压测的时候发现调用某个接口同一个入参,返回的商品数据不一致。 使用技术:threadLocal 问题原因:使用ThreadLocal没有remove。 导致问题:1内存溢出,ThreadLocal依赖没有释放,无法GC。 2线程池的某个线程会被反复使用,ThreadLocal的生命周期不等于一次Request的生命周期,造成获取threadL...

Sean Zou 1万+

【异常】安装OpenClaw遇到 Windows环境pnpm安装node-llama-cpp postinstall生命周期脚本执行失败完整解决方案

摘要: Windows环境下使用pnpm安装node-llama-cpp时,postinstall脚本执行失败(错误码3221225477),主要因缺少C++编译工具链或预构建二进制下载失败。解决方案: 基础排查:确保管理员权限、Node.js ≥18、路径无中文; 安装编译工具:推荐Visual Studio的“C++桌面开发”组件或windows-build-tools; 环境变量配置:强制CPU模式+国内镜像(NODE_LLAMA_CPP_FORCE_CPU=true,镜像地址替换为国内源); pnp

奶爸的编程之路,也就一周冷个三天 620

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1276

ThreadLocal使用

ThreadLocal使用

幽静净土的技术分享 3008

提示工程架构师干货:AI上下文工程在社交媒体舆情溯源中的应用

在舆情溯源中,“上下文”不是单一的“文本内容”,而是多维度、多源的信息集合溯源时间:从事件爆发到找到源头,只用了24小时(传统方法需要3-5天);溯源准确性:100%(通过人工验证确认);后续行动:品牌X发布了澄清声明,揭露了品牌Y的恶意行为,舆情在48小时内平息。社交媒体舆情溯源是一个“复杂的系统工程”,需要结合数据、模型、上下文理解。AI上下文工程的出现,让我们从“被动应对”转向“主动溯源”,从“模糊判断”转向“精准分析”。

Java大师兄的博客 813

java web项目使用ThreadLocal 的坑、注意事项以及是否会内存泄漏

好多人都认为web项目每次请求都会占用一个线程,但是我们要知道这个线程不一定是新的,可能是从tomcat线程池里获取的。 tomcat启动的时候会创建一个线程池,配置如下 &lt;Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" accept..

qq_23367963的博客 1347

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ThreadLocal 常见使用场景

ThreadLocal 之前一篇文章我已经和大家探讨了ThreadLocal的实现原理,并分析了源码,现在这篇文章带大家了解一下其常见的使用场景,在最近的项目中我也用到了。首先复习下其包含的四个方法: void set(Object value) // 设置当前线程的线程局部变量的值。 public Object get() // 该方法返回当前线程所对应的线程局部变量。 public void remove()// 将当前线程局部变量的值删除,其目的是为了减少内存使用,加快内存回收。 protected

m0_61802230的博客 7522

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

使用ThreadLocal请务必remove

场景说明:压测的时候发现调用某个接口同一个入参,返回的商品数据不一致。 使用技术:threadLocal 问题原因:使用ThreadLocal没有remove。 导致问题:1内存溢出,ThreadLocal依赖没有释放,无法GC。 2线程池的某个线程会被反复使用,ThreadLocal的生命周期不等于一次Request的生命周期,造成获取threadLocal内数据异...

lgxzzz的博客 877

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

反问面试官3个ThreadLocal的问题

接下来,我想先说说ThreadLocal的用法和使用场景,然后反问面试官3个关于ThreadLocal的话题。

程序员半支烟,wechat:yclxiao 970

JAVA-Web-ThreadLocal

ThreadLocal的使用线程不安全的解决方案:使用场景1:需求:1000个任务的时间格式化 线程不安全的解决方案: 1.CPU抢占执行 2.加锁synchronized\lock 3.私有变量-------ThreadLocal线程级别的私有变量,和任务中的私有变量完全不同 使用场景1: 解决线程安全问题; 需求:1000个任务的时间格式化 方案A:加锁,可以解决线程不安全的问题,但需要排队执行, 方案B:ThreadLocal创建线程级别的变量–10个SimpleDateFormat对象; 1.通过线

weixin_44712669的博客 664

ThreadLocal常见使用场景

threadLocal常见常见,面试可用!

自救 唯有自强 819

ThreadLocal使用场景

ThreadLocal在设计之初就是为解决并发问题⽽提供⼀种⽅案,每个线程维护⼀份⾃⼰的数据,达到线程隔离的效果

941

个人对threadlocal的理解

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); }

zhangustb 160

内存溢出原因(发现问题)

但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。Java中的内存溢出(Memory Overflow)通常指的是Java虚拟机(JVM)在运行时耗尽了可用内存资源,无法再分配足够的内存来满足程序的需求。一般springBoot应用,同一时间的最大量是有限的,默认情况下tomcat的线程池中的线程最多只有200个,所以同一时间最多只能处理两百个请求。2、每一个请求,内存中加载的数据比较多,比如说一个用户请求了几千条,几万条数据。

2302_77971734的博客 1678

ThreadLocal的三种使用场景(转发)

目录 场景一: 场景二: 场景三: 慎用的场景 ThreadLocal包含了四个方法: void set(Object value) 设置当前线程的线程局部变量的值。 public Object get() 该方法返回当前线程所对应的线程局部变量。 public void remove() 将当前线程局部变量的值删除,其目的是为了减少内存使用,加快内存回收。 protected Object initialValue() 返回该线程局部变量的初始值,该方法是一个protected..

study_maker的博客 1014
上一篇: freemarker如何编写自定义标签
下一篇: 根据表结构自动生成mybatis文件
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值